【发布时间】:2015-06-19 10:09:17
【问题描述】:
我喜欢Prism 5.0 Interactivity 的工作方式,但它可以在它创建的Window 中打开UserControls 和Panels 等。因此,由于它不能将 Window 放在另一个 Window 中,因此您不能传递以 Window 作为根元素的视图。
问题是,当它将我的 UserControl 放在它创建的 Window 中时,Window 没有要选择的 MinWidth 或 MinHeight 或 ResizeMode="NoResize" 选项,因此,用户界面变得很糟糕。
有什么方法可以控制Window 的属性,以便我可以随意自定义它?
PS:令我惊讶的是,像微软这样一家重要的大公司如何能够发布一个缺少此类内容的最佳实践库。
根据要求,这里有一个代码示例:
为了在 Prism 中以新的 Window 打开视图,您必须将其添加到当前视图(将调用在其 ViewModel 中创建新 Window 的视图):
<prism:InteractionRequestTrigger SourceObject="{Binding ItemSelectionRequest, Mode=OneWay}">
<!-- This PopupWindowAction has a custom view defined. When this action is executed the view will be shown inside a new window -->
<!-- Take into account that the view and its view model are created only once and will be reused each time the action is executed -->
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:ItemSelectionView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
如果您将此ItemSelectionView 从UserControl 更改为Window,您将收到此异常:
因为基本上 Prism 在创建新的 Window 和新的 ItemSelectionView 并尝试将其中一个放在另一个中时,会尝试将 Window 放在 Window 中...假设 Windows始终是根,但在这种情况下,Window ItemSelectionView 将被放置为新 Window 的子级。
有关其工作原理的更多信息,请转到我发布的链接。
现在我正在使用后面的代码来调整窗口,我检查这个 UserControl 是否是窗口的根,只有在这种情况下,我才使用 Window's 设置(这并不理想,但仍然不违反 MVVM):
private void OnLoaded(object sender, System.Windows.RoutedEventArgs e)
{
Window parentWindow = Window.GetWindow(this);
if (parentWindow != null && parentWindow.Content == this)
{
parentWindow.ResizeMode = ResizeMode.NoResize;
parentWindow.SizeToContent = SizeToContent.Height;
parentWindow.MinHeight = this.MinHeight;
parentWindow.MinWidth = this.MinWidth;
}
}
【问题讨论】:
-
你能发布一些你的问题的代码示例吗?