如何从ViewModel创建和显示弹出窗口

时间:2014-06-20 18:27:15

标签: c# wpf popup viewmodel

首先,如果问题看起来很简单,我应该道歉,但我是WPF和MVVM的新手,我真的不知道该怎么做。

我需要的是显示ViewModel的弹出窗口。我知道我可以在viewModel中有一个布尔属性并将其绑定到Popup的IsOpen属性,但我不知道在哪里创建这个弹出窗口。

我有一些视图,每个视图都必须根据不同的情况显示某些弹出消息。现在我需要知道是否应该在每个视图中创建几个弹出窗口并将它们的IsOpen属性绑定到ViewModel中的属性,或者有更好的解决方案,如果我应该在视图中创建它们,在哪里放置它们?在网格中,StackPanel或其他任何地方。

如果我没有清楚解释,请告诉我。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

这是示例弹出窗口。 reference

basic popup msdn overview

<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;
    }

答案 1 :(得分:1)

我通常有一个第三个对象来控制我的弹出窗口和对话框,比如Caliburn的WindowManager

WindowManager

Witch将ViewModel作为内容并在弹出窗口中显示它的对应视图。

您可以执行类似操作并将ViewModel中的内容绑定到弹出窗口或对话框。

对于Instance,这是我为此目的创建的自定义操作:

OpenPopupWindowAction