WPF尝试创建具有自定义窗口控件的库,但出现错误:显示窗口后无法更改AllowsTransparency

时间:2018-10-01 01:30:30

标签: wpf xaml custom-controls

我想创建一个自定义控件模板(在库/单独的程序集上),并基于该自定义控件模板启动一个对话框/消息框,而无需基于该自定义控件模板的单独的客户端XAML。

控制模板的开发如下...

控制模板类

public class DialogWindow : Window
{
    #region Constructors
    static DialogWindow()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(DialogWindow),
            new FrameworkPropertyMetadata(typeof(DialogWindow)));
    }

    public DialogWindow()
    {
    }

    public DialogWindow(string title, string header, string message)
    {
        Title = title;
        HeaderText = header;
        MessageText = message;
    }
        ///...
        ///the rest of the custom control class
        ///...

控制模板样式

    <Style TargetType="{x:Type customcontrols:DialogWindow}">

        <Setter Property="WindowStyle" Value="None" />
        <Setter Property="AllowsTransparency" Value="True" />
        <Setter Property="ResizeMode" Value="NoResize"/>
        ...
        <!-- the rest of the control template-->
        ...
    </Style>

在客户端应用程序上,我想使用控制模板作为。非常类似于MessageBox类型声明,但完全是从零开始的样式。

客户代码

        CustomControls.DialogWindow custom = new CustomControls.DialogWindow("Sample Title", "Sample Header", 
            Properties.Resources.DocumentResourceSample);
        custom.IsOKEnabled = true;
        custom.OKButtonClick += CloseDialog;
        custom.ShowDialog();

尝试启动对话框时遇到的完整错误是

  

错误:显示窗口或调用WindowInteropHelper.EnsureHandle后,无法更改AllowsTransparency。

我真的很想通过自定义控件模板样式设置AllowsTransparency,否则会出现黑色粗边框。

你们认为我在这里想念什么?

2 个答案:

答案 0 :(得分:0)

如果你们有兴趣,这就是我设法解决的方法。 我创建了一个实现自定义对话框窗口控件的用户控件,例如

代码

    public partial class CustomDialogBox : DialogWindow
    {
    public CustomDialogBox()
    {
        InitializeComponent();
    }

还连接了所有自定义内容

    public CustomDialogBox(string title, string header, string message)
    {
        Title = title;
        HeaderText = header;
        MessageText = message;

        InitializeComponent();
    }

XAML

<customcontrols:DialogWindow 
    Style="{StaticResource {x:Type customcontrols:DialogWindow}}"
    >
     <Grid>
     </Grid>
</customcontrols:DialogWindow>

一切似乎都运行良好。 我认为这不是一个很好的实现。我仍然对是否有更好的方法感兴趣。

答案 1 :(得分:0)

对于在尝试创建自定义窗口类并使用 WPF 样式对其进行样式设置时偶然发现这种情况的任何人,我已经找到了一个很好的解决方案来解决此问题,而无需在 Window 类中使用硬代码 AllowTrasparency .

我在此处记录并分享了代码:https://gist.github.com/aurimasniekis/53533fddefe95b04bcad37b815197b8e

附言这并不能解决在运行时更改 AllowTrasparency 的问题,但允许您在创建窗口时使用样式来控制它。