首先,如果这个问题看起来很简单,我应该道歉,但是我是WPF和MVVM的新手,我真的不知道如何做这项工作。
我需要的是从ViewModel显示弹出窗口。我知道我可以在viewModel中有一个布尔属性,并将其绑定到弹出窗口的IsOpen
属性,但我不知道在哪里创建这个弹出窗口。
我有一些视图,每个视图必须根据不同的情况显示某些弹出消息。现在我需要知道我是否应该在每个视图中创建几个弹出窗口,并将它们的IsOpen
属性绑定到ViewModel中,或者有更好的解决方案,如果我应该在视图中创建它们,在哪里放置它们?在网格中,在StackPanel
中或其他任何地方。
我通常有第三个对象来控制我的弹出窗口和对话框,像Caliburn的WindowManager
WindowManager
Witch将ViewModel作为内容,并在弹出窗口中显示相应的视图。
你可以做类似的事情,从你的ViewModel绑定一个内容到你的弹出窗口或对话框。
例如,下面是我为此目的创建的一个自定义动作:
OpenPopupWindowAction
这是一个示例弹出窗口。参考
基本弹出式MSDN概述
<StackPanel>
<CheckBox Name="PCheckBox" Margin="10,10,0,0"
Content="Popup Window"/>
<Button HorizontalAlignment="Left" Width="129" Margin="10,10,0,0">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="theTransform"
Storyboard.TargetProperty="(RotateTransform.Angle)"
From="0" To="360" Duration="0:0:5" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
Start Animation
</Button>
<Popup IsOpen="{Binding ElementName=PCheckBox,Path=IsChecked}"
PlacementTarget="{Binding ElementName=PCheckBox}"
AllowsTransparency="True"
PopupAnimation="Slide"
HorizontalOffset="150"
VerticalOffset="100"
>
<Canvas Width="100" Height="100" Background="Green" Margin="150">
<Canvas.RenderTransform>
<RotateTransform x:Name="theTransform" />
</Canvas.RenderTransform>
<TextBlock TextWrapping="Wrap" Foreground="LightGray">
Rotating Popup
</TextBlock>
</Canvas>
</Popup>
private void OnPopupLoaded(object sender, RoutedEventArgs e)
{
this.ParentPopup.HorizontalOffset = (Window.Current.Bounds.Width - gdChild.ActualWidth) / 2;
this.ParentPopup.VerticalOffset = (Window.Current.Bounds.Height - gdChild.ActualHeight) / 2;
}