4

Caliburn.Micro を使用した WPF アプリケーションがあります。バックグラウンドで何らかの作業が行われるのをアプリケーションが待機するようにしたい場合は、 ( MahApps.Metroからの) シャドウとプログレス リングでアプリケーションをオーバーレイできるようにしたいと考えています。

私が現在持っているものは実際に機能しますが、オーバーレイは設計時に常にオンになっています。私のShellViewウィンドウは次のようになります。

<Window ...>
    ...
    <Grid>
        ...
        <Rectangle x:Name="waitShadow" Fill="#3f000000" Stroke="Black" StrokeThickness="0" Visibility="{Binding IsWaiting, Converter={StaticResource BooleanToVisibilityConverter}}" Grid.RowSpan="2"/>
        <ContentControl ... Visibility="{Binding IsWaiting, Converter={StaticResource BooleanToVisibilityConverter}}">
            <Controls:ProgressRing ...> <!-- from MahApps.Metro -->
            </Controls:ProgressRing>
        </ContentControl>
    </Grid>
</Window>

ShellViewModelのクラスには public bool プロパティがIsWaitingあり、それをシャドウに設定するtrueとリングが表示され、すべてが無効になります。設定するとfalse通常に戻るため、バインディングが機能します ( PropertyChanged アドインでFodyを使用しています)。唯一の問題は、Visibilityプロパティが設計時に折りたたまれていないことです。

設計時にオーバーレイを機能させるより良い方法はありますか?

4

2 に答える 2

8

FallbackValueバインディングにa を設定できます。Collapseこれは設計時に行われます

Visibility="{Binding IsWaiting, Converter={StaticResource BooleanToVisibilityConverter}, FallbackValue=Collapsed}"

IsWaitingを作成してそこにデフォルトを設定することもできDependancyPropertyますが、これが最も簡単な解決策だと思います。

于 2012-12-06T04:53:51.390 に答える
2

FallbackValue は常に機能するとは限りません。つまり、デザイナが実際にデザイン時のデータにバインドされていて、FallbackValue が実際にバインドの実行時の動作を変更する場合、多くの状況では望ましくない場合があります。私は、デザイナーが実行時の動作を台無しにすることを心配することなく、デザイナーの UI をいじることができるマークアップ拡張機能を作成しました。私はそれについてここに書きました: http://www.singulink.com/CodeIndex/post/wpf-visibility-binding-with-design-time-control

次のように使用できます。

<Grid Visibility="{data:Value {Binding RootObject, Converter={StaticResource NullToVisibilityConverter}}, DesignValue=Visible}">
    <TextBlock Background="Red" Text="Testing visibility" />
</Grid>

ValueExtension のコードは次のとおりです (更新やバグ修正はブログに投稿されるため、最新バージョンを確認することをお勧めします)。

public class ValueExtension : MarkupExtension
{
    public object DesignValue { get; set; } = DependencyProperty.UnsetValue;

    [ConstructorArgument("value")]
    public object Value { get; set; } = DependencyProperty.UnsetValue;

    public ValueExtension() { }

    public ValueExtension(object value)
    {
        Value = value;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
        var property = provideValueTarget.TargetProperty as DependencyProperty;
        var target = provideValueTarget.TargetObject as DependencyObject;

        if (target == null || property == null)
           return this;

        object value = DesignerProperties.GetIsInDesignMode(target) && DesignValue != DependencyProperty.UnsetValue ? DesignValue : Value;

        if (value == DependencyProperty.UnsetValue || value == null)
            return value;

        if (value is MarkupExtension)
            return ((MarkupExtension)value).ProvideValue(serviceProvider);

        if (property.PropertyType.IsInstanceOfType(value))
            return value;

        return TypeDescriptor.GetConverter(property.PropertyType).ConvertFrom(value);
    }
}
于 2016-07-05T13:58:35.660 に答える