Mar*_*k W 7 css wpf binding resize sizetocontent
我试图根据其初始高度(当SizeToContent ="WidthAndHeight"时)设置可调整大小窗口的MinHeight/MinWidth.
我见过几个答案/解决方案:
http://weblogs.asp.net/psheriff/archive/2010/01.aspx
然而:
我试图使用MVVM模式,并希望能够在xaml中实现这一点.
我还希望将MinHeight之类的值保留在ViewModel之外 - 我不认为它们属于那里,因为它们将视图行为的一小部分与视图模型联系起来.这是我想留给UX设计师的东西.
我正在努力解决的一个解决方案是使用以下xaml/binding:
<Window
....
x:Name="mainWindow"
SizeToContent="WidthAndHeight"
ResizeMode="CanResizeWithGrip"
MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}"
>
Run Code Online (Sandbox Code Playgroud)
我希望'Mode = OneTime'将MinHeight绑定到窗口高度的初始值.
但它不起作用..
有人可以解释一下原因吗?有符合我标准的解决方案吗?
谢谢,
标记
Naw*_*waz 10
你的代码:
<Window
....
x:Name="mainWindow"
SizeToContent="WidthAndHeight"
ResizeMode="CanResizeWithGrip"
MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}"
>
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为默认值ActualHeight
为零,并且当WPF框架调整窗口大小时,它已经分配MinHeight
了默认值ActualHeight
为零!
您可以尝试的第一件事是:更改Mode=OneTime
为Mode=Default
,以便在调整窗口大小MinHeight
时ActualHeight
更改WPF时可以更新.如果有效,那么你会很高兴.
否则,您将处理该SizeChanged
事件,并在处理程序中可以更新MinHeight
.
<Window
....
x:Name="mainWindow"
SizeToContent="WidthAndHeight"
ResizeMode="CanResizeWithGrip"
SizeChanged="Window_SizeChanged"
>
Run Code Online (Sandbox Code Playgroud)
在代码隐藏中:
bool firstTime= true;
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
FrameworkElement element = sender as FrameworkElement;
if ( firstTime)
{
element.MinHeight = e.NewSize.Height;
firstTime= false;
}
}
Run Code Online (Sandbox Code Playgroud)
希望它能解决你的问题.或者至少会给你一些关于如何处理的想法.如果要修复窗口大小,则还可以MaxHeight
在Window_SizeChanged()
处理程序中设置.
<Window
x:Name="mainWindow"
SizeToContent="WidthAndHeight"
ResizeMode="CanResizeWithGrip"
>
<Window.Triggers>
<EventTrigger RoutedEvent="SizeChanged">
<BeginStoryboard>
<Storyboard Storyboard.TargetName="mainWindow">
<DoubleAnimation Storyboard.TargetProperty="MinHeight"
To="{Binding ElementName=mainWindow, Path=ActualHeight}"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Window.Triggers>
<!---- other code goes here--->
</Window>
Run Code Online (Sandbox Code Playgroud)