我的主窗口的Height
,Left
,Top
和Width
通过样式绑定到它们各自的viewmodel属性。我可以确认视图模型中的这四个属性分别只设置为1920
,1920
,118
,1080
。
但是,当我启动该应用程序时,主窗口上的Top
和Width
属性设置为其他内容(Width
将是1440
和{{1} }是一个通常小于Top
的随机数。是什么原因造成的?
这是我窥探应用程序时看到的内容。请注意300
和Top
如何来自Width
值源:
奇怪的是,当我右键单击Snoop中的那些属性并将其告诉“清除/重置”时,这些属性便开始表现出来。 Snoop在做什么来解决此问题?
其他事实:
Local
和Top
视图模型属性的吸气剂仅被调用一次。堆栈跟踪通过框架绑定初始化代码运行。Width
和Top
视图模型属性的设置器只能从viewmodel构造函数中调用一次,因为它分别将这些属性设置为Width
和118
。1080
。UpdateLayout()
。InvalidateArrange()
。InvalidateMeasure()
。InvalidateProperty(FrameworkElement.WidthProperty)
。InvalidateVisual()
或Top
属性(样式绑定除外)的代码。这是样式:
对不起,我不得不删除类型名称和其他一些内容-这是一个公司应用程序。如果有帮助,则主窗口/视图位于长继承行的结尾,并且Width
是其伟大的祖父。我试图通过MVVM使主窗口更可重用-以前,这些布局属性是在视图的代码中设置的,而视图具有构造函数参数:'(这与为什么我需要键入样式有关,以及为什么该样式基于其他内容。但是继承的类型都无法操纵布局属性。
P.S。我见过其他人抱怨调整WPF Window
的大小有多么困难。最常用的解决方案是绑定Window
和MinWidth
以及MaxWidth
。当我这样做时,Width
确实被强制设置为我想要的值,但是您无法调整窗口的大小,Width
属性仍然具有其Width
值源和{{ 1}}仍然不正确。
答案 0 :(得分:0)
鉴于"[Top] cannot be set through a style",并给出了the complications with binding Window.Width,我以另一种方式解决了这个问题。
我创建了这个名为WindowLayout
的附加属性,并将其绑定到我风格的viewmodel属性:
public static class WindowLayoutBehavior
{
public static readonly DependencyProperty LayoutProperty = DependencyPropertyHelpers.RegisterAttached(
(Window x) => GetLayout(x),
new PropertyMetadata(HandleLayoutChanged));
private static void HandleLayoutChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (!(d is Window window))
return;
if (!(e.NewValue is Rect rect))
return;
window.Height = rect.Height;
window.Left = rect.Left;
window.Top = rect.Top;
window.Width = rect.Width;
}
[AttachedPropertyBrowsableForType(typeof(Window))]
public static Rect GetLayout(Window window) =>
window.GetValue(LayoutProperty) is Rect rect
? rect
: default;
public static void SetLayout(Window window, Rect rect) =>
window.SetValue(LayoutProperty, rect);
}
DependencyPropertyHelpers.RegisterAttached
是一种以您期望的方式创建附加属性的速记助手方法。
使用样式:
<Setter
Property="WindowLayoutBehavior.Layout"
Value="{Binding WindowLayout, Mode=OneWay}"/>
现在,当我监听应用程序时,Height
,Left
,Top
和Width
都显示为具有Local
值源,并且它们在发生变化时会发生变化viewmodel属性更改,因此对我有用。