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

本文关键字:显示 窗口 创建 ViewModel | 更新日期: 2023-09-27 18:09:39

首先,如果这个问题看起来很简单,我应该道歉,但是我是WPF和MVVM的新手,我真的不知道如何做这项工作。

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

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

如果我没有解释清楚,请让我知道。

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

我通常有第三个对象来控制我的弹出窗口和对话框,像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;
    }