我不确定我是否使用了正确的方式,所以我试着在这里描述我的情况。请帮助指出细节。
我的目的是自定义WPF Popup
类并实现特定的弹出面板。我使用CustomControl来实现如下:
以下是Generic.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication3">
<Style TargetType="{x:Type local:CCPopup}">
<Setter Property="AllowsTransparency" Value="True" />
<Setter Property="StaysOpen" Value="False" />
<Setter Property="Placement" Value="Center" />
<Setter Property="Child">
<Setter.Value>
<Border Background="Red"
Width="30"
Height="30" />
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
以下是代码,它只注册元样式信息:
public class CCPopup : Popup
{
static CCPopup()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CCPopup), new FrameworkPropertyMetadata(typeof(CCPopup)));
}
}
我到目前为止遇到的问题可归纳如下:
1)我试着写:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication3">
<Style TargetType="{x:Type local:CCPopup}" BasedOn="{StaticResource {x:Type Popup}}">
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="StaysOpen" Value="False" />
<Setter Property="Placement" Value="Center" />
<Setter Property="Child">
<Setter.Value>
<Border Background="Red"
Width="30"
Height="30" />
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
但是这不起作用,我得到错误{x:Type Popup}
无法解决。为什么呢?
关于我的MainWindow.xaml:我只在其资源中添加<CCPopup x:Key="popup" />
并创建一个按钮,当我点击按钮时,我将弹出的PlacementTarget
绑定到此按钮并设置弹出窗口{{1}在代码中将属性设置为true。
2)当我在代码中创建CCPopup实例时,例如IsOpen
,某些Style不起作用,例如CCPopup p = new CCPopup()
和AllowsTransparency
,将不会被设置我在xaml Style中给出的值。但是当我从xaml StaysOpen
创建一个实例并从代码中的资源引用它时,样式正常工作。你能指出我犯了哪个错误吗?
3)好奇为什么<CCPopup x:Key="popup" />
班级没有Popup
属性?
感谢您的帮助。