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班级有一个公共 bool 属性IsWaiting,当我将其设置true为阴影和环时,一切都被禁用。当我将它设置为它时,false它会恢复正常,因此绑定有效(我正在使用Fody和 PropertyChanged 插件)。唯一的问题是该Visibility属性在设计时没有折叠。

有没有更好的方法让覆盖在设计时起作用?

4

2 回答 2

8

您可以FallbackValue在绑定上设置一个,这将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 回答