前提・実現したいこと
FrameworkElementに添付できるProgressRingを表示するビヘイビアを作成しています。
ViewModelの状態に応じて対象コントロールにProgressRingをオーバーレイ表示します。
MahApps.MetroのProgressRingを単純に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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。