0

我有一个为基于 XNA 的磁贴编辑器编写的用户控件。这是我现在尝试在 WPF 应用程序中托管的基于 winforms 的控件。

我正在使用 WindowsFormsHost 控件来嵌入 winforms 用户控件。在 winforms 用户控件上,我有一个名为 XnaBackground 的自定义属性,它的类型为 Microsoft.Xna.Framework.Color。我可以在 IntelliSense 的 XAML 中看到该属性正常,但是当我尝试设置它时,我在 XAML 窗口中收到一条消息,显示“无法转换“Microsoft.Xna.Framework.Blue””。

我尝试使用自定义 IValueConverter 但由于该属性不是依赖属性,控件也不是依赖对象,因此绑定不起作用。

这是 winforms 控件上的属性声明:

    [Category("Appearance"), DescriptionAttribute("Gets/Sets a value indicating the background color to use.")]
    [Bindable(true)]
    public Color XnaBackground { get; set; }

这是我的 WPF 应用程序中的 XAML:

<Window x:Class="TileEditorWPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TileEditorWPF"
    xmlns:winforms="clr-namespace:TileDisplay;assembly=TileDisplay"
    Title="MainWindow" Height="600" Width="800" Loaded="WindowLoaded">

<Window.Resources>
    <local:XnaColorConverter x:Key="colorConverter" />
</Window.Resources>
<DockPanel LastChildFill="true">
    <WindowsFormsHost Name="windowsFormsHost1" DockPanel.Dock="Top" 
                                      Background="Transparent"         
                                      HorizontalAlignment="Stretch"             
                                      VerticalAlignment="Stretch" >
        <winforms:TileDisplayControl XnaBackground="Blue" x:Name="tileDisplay1" OnDraw="TileDisplayControl_OnDraw" OnInitialize="TileDisplayControl_OnInitialize" />            
    </WindowsFormsHost>
</DockPanel>

我不是 WPF 专家,所以如果答案很明显,请原谅我。在过去的 4 个小时里,我一直在敲我的脑袋,而谷歌搜索却让我无处可去。这是一个小众问题,很难找到这个特定主题的任何趋势。

4

1 回答 1

2

您需要实现一个TypeConverter知道如何将您在属性"Blue"中设置的字符串值转换为类型的方法。XnaBackgroundMicrosoft.Xna.Framework.Color

因为您没有创建Microsoft.Xna.Framework.Color类型/无法访问其源代码,所以您无法将[TypeConverter(typeof(ToXnaColorConverter)]类型放在指向您的转换器的位置。

但是,您可以将该属性放在属性上XnaBackground。因此,当在您的XnaBackground属性上设置“字符串”时,它会通过您的TypeConverter.... 它应该解释字符串并提供合适的Xna.Framework.Color值。

[Category("Appearance"), DescriptionAttribute("Gets/Sets a value indicating the background color to use.")]
[Bindable(true)]
[TypeConverter(typeof(ToXnaColorConverter)] 
public Color XnaBackground { get; set; }
于 2012-07-13T01:22:54.633 回答