WPF Popup 作为单独的控件编写在 xaml
WPF Popup as a separate control written in xaml
是否有机会创建一个 WPF Popup 作为单独的控件,使其不在 window 或用户控件中?
我有一个用 XAML 编写的弹出窗口:
<Popup PopupAnimation="Fade" Name="MyPopup" MinWidth="200" MinHeight="100" Width="200" Height="100" Placement="Center" VerticalAlignment="Center" HorizontalAlignment="Center" IsEnabled="True" IsOpen="False">
<Grid Width="Auto" Height="Auto" Background="Gray">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border BorderThickness="2" CornerRadius="8" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.RowSpan="2">
<Border.BorderBrush>
<SolidColorBrush Color="Gray"/>
</Border.BorderBrush>
<Border.Background>
<SolidColorBrush Color="White"/>
</Border.Background>
</Border>
<StackPanel Grid.Row="0">
<Label Foreground="Blue" Content="Popup_Title"/>
</StackPanel>
<GroupBox Grid.Row="1" Header="Popup example content">
<StackPanel>
</StackPanel>
</GroupBox>
</Grid>
</Popup>
现在,单击我的其他控件的按钮时,我想做这样的事情:
private void Button_Click(object sender, RoutedEventArgs e)
{
PopupControl p = new PopupControl();
p.IsOpen = true;
}
通过查看 UserControl 或 Window 的示例,我了解到我需要将此弹出窗口与实际的 c# class 连接起来,例如:
public partial class PopupControl : Popup
{
public PopupControl()
{
InitializeComponent();
}
}
然后在 Popup 的 XAML 中添加 class:
x:Class="WpfApplication1.PopupControl"。
但有两件事:
1) PopUp
没有x:Class这样的东西
2) 从 Popup 派生不会有 InitializeComponent();方法。
你几乎答对了。将您的 Popup
代码复制粘贴到它自己的 XAML 文件中时,您没有添加包含附加 属性 x:Class
的必要 x
命名空间:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
只要将它添加到根元素(Popup),就可以添加 x:Class="WpfApplication1.PopupControl"
。这将导致在您的 obj
文件夹中生成部分 class,其中包含您缺少的 InitializeComponent
方法。
最简单的方法是
- 正在从 "Add Item" 对话框创建一个新的
UserControl
。
- 然后,将根元素从
UserControl
重命名为 Popup
。
- 最后,从class后面的代码中,去掉
: UserControl
即可。
是否有机会创建一个 WPF Popup 作为单独的控件,使其不在 window 或用户控件中?
我有一个用 XAML 编写的弹出窗口:
<Popup PopupAnimation="Fade" Name="MyPopup" MinWidth="200" MinHeight="100" Width="200" Height="100" Placement="Center" VerticalAlignment="Center" HorizontalAlignment="Center" IsEnabled="True" IsOpen="False">
<Grid Width="Auto" Height="Auto" Background="Gray">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border BorderThickness="2" CornerRadius="8" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.RowSpan="2">
<Border.BorderBrush>
<SolidColorBrush Color="Gray"/>
</Border.BorderBrush>
<Border.Background>
<SolidColorBrush Color="White"/>
</Border.Background>
</Border>
<StackPanel Grid.Row="0">
<Label Foreground="Blue" Content="Popup_Title"/>
</StackPanel>
<GroupBox Grid.Row="1" Header="Popup example content">
<StackPanel>
</StackPanel>
</GroupBox>
</Grid>
</Popup>
现在,单击我的其他控件的按钮时,我想做这样的事情:
private void Button_Click(object sender, RoutedEventArgs e)
{
PopupControl p = new PopupControl();
p.IsOpen = true;
}
通过查看 UserControl 或 Window 的示例,我了解到我需要将此弹出窗口与实际的 c# class 连接起来,例如:
public partial class PopupControl : Popup
{
public PopupControl()
{
InitializeComponent();
}
}
然后在 Popup 的 XAML 中添加 class:
x:Class="WpfApplication1.PopupControl"。
但有两件事:
1) PopUp
没有x:Class这样的东西2) 从 Popup 派生不会有 InitializeComponent();方法。
你几乎答对了。将您的 Popup
代码复制粘贴到它自己的 XAML 文件中时,您没有添加包含附加 属性 x:Class
的必要 x
命名空间:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
只要将它添加到根元素(Popup),就可以添加 x:Class="WpfApplication1.PopupControl"
。这将导致在您的 obj
文件夹中生成部分 class,其中包含您缺少的 InitializeComponent
方法。
最简单的方法是
- 正在从 "Add Item" 对话框创建一个新的
UserControl
。 - 然后,将根元素从
UserControl
重命名为Popup
。 - 最后,从class后面的代码中,去掉
: UserControl
即可。