質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

812閲覧

WPF AdornerLayerでアニメーションが正しく再生されない

mikupedia

総合スコア159

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/12/13 10:42

編集2018/12/14 00:21

前提・実現したいこと

FrameworkElementに添付できるProgressRingを表示するビヘイビアを作成しています。
ViewModelの状態に応じて対象コントロールにProgressRingをオーバーレイ表示します。

MahApps.MetroProgressRingを単純にAdornerLayerで表示させる機能なのですが、
一応表示はできるもののアニメーションの動きがどうもおかしいです。
解決方法があればご教授いただけないでしょうか?
※ソースコードはVBで記載しましたが、C#でも問題ありません。

発生している問題・エラーメッセージ

添付イメージの通り、Grid内に配置された左上のProgressRingは正しく再生されていますが、
AdornerLayerに配置された中央のProgressRingはプロット数、アニメションが正しくありません。

(2018/12/14 追記)
プロット数は本来6つ表示されなければなりませんが、AdornerLayerは3つなくウィンドウサイズを変更すると数が変わるようで3つとは限りません。
あと開始と終了に差異が出てしまっています。
イメージ説明

該当のソースコード

VB.NET

1Class MainWindow 2 Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 3 Dim LoadingRingAdorner = New LoadingRingAdorner(LayoutRoot) 4 End Sub 5End Class 6 7Public Class LoadingRingAdorner 8 Inherits ControlHostAdornerBase 9 10 Public Sub New(adornedElement As UIElement) 11 MyBase.New(adornedElement) 12 Host.Children.Add(New ProgressRing) 13 End Sub 14End Class 15 16Public Class ControlHostAdornerBase 17 Inherits Adorner 18 Implements IDisposable 19 20 Protected Property AdornerLayer As AdornerLayer 21 Get 22 Return _AdornerLayer 23 End Get 24 Private Set(value As AdornerLayer) 25 _AdornerLayer = value 26 End Set 27 End Property 28 Private Property _AdornerLayer As AdornerLayer 29 30 Protected Property Host As Grid 31 32 Protected Sub New(adornedElement As UIElement) 33 MyBase.New(adornedElement) 34 AdornerLayer = AdornerLayer.GetAdornerLayer(adornedElement) 35 Host = New Grid() 36 If AdornerLayer IsNot Nothing Then 37 AdornerLayer.Add(Me) 38 End If 39 End Sub 40 41 Public Sub Detach() 42 AdornerLayer.Remove(Me) 43 End Sub 44 45 Protected Overrides ReadOnly Property VisualChildrenCount As Integer 46 Get 47 Return 1 48 End Get 49 End Property 50 51 Protected Overrides Function MeasureOverride(constraint As Size) As Size 52 Host.Measure(constraint) 53 Return MyBase.MeasureOverride(constraint) 54 End Function 55 56 Protected Overrides Function ArrangeOverride(finalSize As Size) As Size 57 Host.Arrange(New Rect(finalSize)) 58 Return MyBase.ArrangeOverride(finalSize) 59 End Function 60 61 Protected Overrides Function GetVisualChild(index As Integer) As Visual 62 If VisualChildrenCount <= index Then 63 Throw New IndexOutOfRangeException() 64 End If 65 Return Host 66 End Function 67 68#Region "IDisposable Support" 69 Private disposedValue As Boolean ' 重複する呼び出しを検出するには 70 ' IDisposable 71 Protected Overridable Sub Dispose(disposing As Boolean) 72 If Not disposedValue Then 73 If disposing Then 74 ' TODO: マネージド状態を破棄します (マネージド オブジェクト)。 75 Detach() 76 End If 77 ' TODO: アンマネージド リソース (アンマネージド オブジェクト) を解放し、下の Finalize() をオーバーライドします。 78 ' TODO: 大きなフィールドを null に設定します。 79 End If 80 disposedValue = True 81 End Sub 82 ' TODO: 上の Dispose(disposing As Boolean) にアンマネージド リソースを解放するコードが含まれる場合にのみ Finalize() をオーバーライドします。 83 Protected Overrides Sub Finalize() 84 ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。 85 Dispose(False) 86 MyBase.Finalize() 87 End Sub 88 ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。 89 Public Sub Dispose() Implements IDisposable.Dispose 90 ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。 91 Dispose(True) 92 ' TODO: 上の Finalize() がオーバーライドされている場合は、次の行のコメントを解除してください。 93 GC.SuppressFinalize(Me) 94 End Sub 95#End Region 96End Class

XAML

1<Window x:Class="MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 xmlns:mahapps.control="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" 8 mc:Ignorable="d" 9 Title="MainWindow" Height="450" Width="800"> 10 <Grid Name="LayoutRoot"> 11 <mahapps.control:ProgressRing HorizontalAlignment="Left" VerticalAlignment="Top"/> 12 </Grid> 13</Window>

MahApps.Metro.Controls.ProgressRing

補足情報(FW/ツールのバージョンなど)

Visual Studio 2017 Community(VB)
.Net Freamwork 4.7.2
MahApps.Metro v1.6.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

AddLogicalChild()とAddVisualChild()でビジュアルツリーへ追加してやる必要がありました。

VB

1Public Class ControlHostAdornerBase 2 Inherits Adorner 3 Implements IDisposable 4 5 Protected Property AdornerLayer As AdornerLayer 6 Get 7 Return _AdornerLayer 8 End Get 9 Private Set(value As AdornerLayer) 10 _AdornerLayer = value 11 End Set 12 End Property 13 Private Property _AdornerLayer As AdornerLayer 14 15 Protected Property Host As Grid 16 17 Protected Sub New(adornedElement As UIElement) 18 MyBase.New(adornedElement) 19 AdornerLayer = AdornerLayer.GetAdornerLayer(adornedElement) 20 Host = New Grid() 21 AddLogicalChild(Host) 22 AddVisualChild(Host) 23 If AdornerLayer IsNot Nothing Then 24 AdornerLayer.Add(Me) 25 End If 26 End Sub 27 28 Public Sub Detach() 29 AdornerLayer.Remove(Me) 30 RemoveLogicalChild(Host) 31 RemoveVisualChild(Host) 32 End Sub 33 34 Protected Overrides ReadOnly Property VisualChildrenCount As Integer 35 Get 36 Return 1 37 End Get 38 End Property 39 40 Protected Overrides Function MeasureOverride(constraint As Size) As Size 41 Host.Measure(constraint) 42 Return MyBase.MeasureOverride(constraint) 43 End Function 44 45 Protected Overrides Function ArrangeOverride(finalSize As Size) As Size 46 Host.Arrange(New Rect(finalSize)) 47 Return MyBase.ArrangeOverride(finalSize) 48 End Function 49 50 Protected Overrides Function GetVisualChild(index As Integer) As Visual 51 If VisualChildrenCount <= index Then 52 Throw New IndexOutOfRangeException() 53 End If 54 Return Host 55 End Function 56 57#Region "IDisposable Support" 58 Private disposedValue As Boolean ' 重複する呼び出しを検出するには 59 ' IDisposable 60 Protected Overridable Sub Dispose(disposing As Boolean) 61 If Not disposedValue Then 62 If disposing Then 63 ' TODO: マネージド状態を破棄します (マネージド オブジェクト)。 64 Detach() 65 End If 66 ' TODO: アンマネージド リソース (アンマネージド オブジェクト) を解放し、下の Finalize() をオーバーライドします。 67 ' TODO: 大きなフィールドを null に設定します。 68 End If 69 disposedValue = True 70 End Sub 71 ' TODO: 上の Dispose(disposing As Boolean) にアンマネージド リソースを解放するコードが含まれる場合にのみ Finalize() をオーバーライドします。 72 Protected Overrides Sub Finalize() 73 ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。 74 Dispose(False) 75 MyBase.Finalize() 76 End Sub 77 ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。 78 Public Sub Dispose() Implements IDisposable.Dispose 79 ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。 80 Dispose(True) 81 ' TODO: 上の Finalize() がオーバーライドされている場合は、次の行のコメントを解除してください。 82 GC.SuppressFinalize(Me) 83 End Sub 84#End Region 85End Class

投稿2018/12/18 07:39

編集2018/12/18 07:40
mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問