gpt4 book ai didi

c# - WPF - 通过相对源绑定(bind)为自定义标记扩展提供设计时值(value)

转载 作者:行者123 更新时间:2023-12-02 21:30:58 25 4
gpt4 key购买 nike

注意:这不仅仅是关于自定义标记扩展。请在标记为重复之前阅读。

我有一个带有转换器的 WPF 标记扩展,它们两个的运行方式如下:

  [ValueConversion(typeof(WindowState), typeof(object))]
internal class WindowStateToObjectConverter : IValueConverter {
public WindowStateToObjectConverter() { }

public WindowStateToObjectConverter(object maximized, object normal) {
this.maximized = maximized;
this.normal = normal;
}

#region Properties
#region Maximized Property
private object maximized;

public object Maximized {
get { return maximized; }
set { maximized = value; }
}
#endregion
#region Normal Property
private object normal;

public object Normal {
get { return normal; }
set { normal = value; }
}
#endregion
#endregion

public object Convert(object value, Type targetType, object param, CultureInfo culture) {
if((value as WindowState? ?? WindowState.Normal) == WindowState.Maximized) return maximized;
else return normal;
}

public object ConvertBack(object value, Type targetType, object param, CultureInfo culture) {
throw new InvalidOperationException("Cannot convert downwards to WindowState");
}
}

[MarkupExtensionReturnType(typeof(Binding))]
internal class WindowMaximizedSwitchExtension : MarkupExtension {
object maximized, normal;

public WindowMaximizedSwitchExtension(object maximized, object normal) {
this.maximized = maximized;
this.normal = normal;
}

public override object ProvideValue(IServiceProvider serviceProvider) {
Binding ret = new Binding("WindowState");
RelativeSource retRSource = new RelativeSource(RelativeSourceMode.FindAncestor);
retRSource.AncestorType = typeof(Window);
ret.RelativeSource = retRSource;
ret.Converter = new WindowStateToObjectConverter(maximized, normal);
return ret.ProvideValue(serviceProvider);
}
}

它们用于我正在设计的自定义窗口 - 它们将用于在窗口最大化时切换某些值(边框宽度、边距等)。然而,在设计时,它们总是返回 null,这确实很痛苦,因为这样我的窗口看起来像这样:

Preview of the window in Visual Studio

...当它应该看起来像这样时:

The window at runtime

(请忽略第一张图片中缺少的标题和图标,不过,如果您有解决方案,请随时回答 - 这本质上是同一个问题。)

出于显而易见的原因,用它进行设计将非常困难。您在窗口预览中看到的唯一主要问题是我使用扩展设置 Row/ColumnDefinition 的地方 - 当它返回 null 时,高度/宽度设置为1*。所以,我的问题是是否有一种方法可以在设计时选择默认值,也许可以代替绑定(bind)(例如非最大化值)。

最佳答案

嗯,我感觉自己像个白痴,但我很快就找到了解决方案:

在表达式的 ProvideValue 方法中,我添加了以下行:

  ret.FallbackValue = normal;

其中 normal 是窗口未最大化时使用的值。

ProvideValue 现在看起来像这样:

public override object ProvideValue(IServiceProvider serviceProvider) {
Binding ret = new Binding("WindowState");
RelativeSource retRSource = new RelativeSource(RelativeSourceMode.FindAncestor);
retRSource.AncestorType = typeof(Window);
ret.RelativeSource = retRSource;
ret.Converter = new WindowStateToObjectConverter(maximized, normal);
ret.FallbackValue = normal;
return ret.ProvideValue(serviceProvider);
}

这将返回设计时的正常值。

关于c# - WPF - 通过相对源绑定(bind)为自定义标记扩展提供设计时值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22289545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com