2012-07-13 57 views
0

我有一個我爲基於XNA的圖塊編輯器編寫的用戶控件。這是一個基於WinForms的控件,我現在試圖在WPF應用程序中進行託管。如何解決XAML中的自定義屬性名稱對於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個小時我一直在b my我的腦袋,谷歌搜索導致我無處可尋。這是一個小問題,很難找到這種特定主題的任何趨勢。

回答

2

你需要實現一個TypeConverter它知道如何您在XnaBackground屬性中設置的"Blue"字符串值轉換爲Microsoft.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; } 
+0

我理解的價值轉換器和已經寫在過去的純WPF項目數。我的問題是,我不能用所需的屬性修飾Microsoft.Xna.Framework.Color類。我想我可以做一個醜陋的黑客,並在運行時注入屬性,但看起來不清潔,不能很好維護。另一種選擇是創建橋接類型以橋接XNA類型和枚舉,我創建自己以表示可以添加屬性的顏色。該解決方案几乎與在運行時注入屬性一樣沒有吸引力。 – SRM 2012-07-13 02:45:01

+0

我跑出了上述評論的空間。在這一點上,我可能只是使用一個字符串屬性,並在渲染控件之前在屬性上執行Enum.TryParse。不是最理想的,我不會得到智能感知,但這是我設計的一個小方面,我不想陷入與WPF一樣困難的細節 - 大量的力量,但在第一次學習時使用很痛苦因爲在WPF中有15種方法可以完成某件事情,但只有一種方法可行。 – SRM 2012-07-13 02:47:18

+1

您不需要裝飾Xna.Framework.Color類....如上所述,您可以將屬性放在您的控件中...然後它將使用您的轉換器將字符串轉換爲Xna顏色。 – 2012-07-13 10:18:31

相關問題