在Windows窗体控件中打开WPF控件时不使用DataTemplate

时间:2012-09-21 19:56:26

标签: c# wpf xaml

我创建了一个DataTemplate来管理ListBox中项目的显示。当我在常规WPF应用程序中打开控件时,它可以正常工作。但是,当我在Windows窗体应用程序中托管的Windows窗体控件中打开它时,不使用datatemplate。认为在该上下文中可能存在“FindResource”问题,我在代码隐藏中添加了DataTemplate。在常规WPF应用程序中打开时,它再次正常工作,但在Windows窗体应用程序中打开时失败。

如果我设置了ListBox本身的背景,我会看到“应该”显示的所有项目的背景和空行 - 所以我知道数据到达那里,只是模板没有适用自己。

加载窗体控件的代码:

_elementHost = new ElementHost();
_elementHost.Dock = DockStyle.Fill;
this.Controls.Add(_elementHost);
NavigationControl userControl = new NavigationControl(); // the wpf control
_elementHost.Child = userControl;

dataTemplate xaml:

<DataTemplate x:Key="WorkingAccountResultTemplate" >
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Test" Width="50" Foreground="Purple" Background="AliceBlue"/>
        <TextBlock Text="{Binding ItemKeyId}" HorizontalAlignment="Stretch" Background="Maroon" />
    </StackPanel>
</DataTemplate>

1 个答案:

答案 0 :(得分:0)

您需要在应用程序中启动WPF实例。为此,请在启动或主要winforms项目中创建App.xaml文件。

App.xaml,除了包含和类声明之外,你应该有以下几行:(你可以有一个只包含include的空文件,所以这部分可以为空)

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/PresentationFramework.Aero;component/themes/Aero.NormalColor.xaml"/>
            </ResourceDictionary.MergedDictionaries>
</Application.Resources>

App.xaml,在后面的代码中:

public partial class App : Application
{
    public App()
    {
        StyleManager.ApplicationTheme =new Windows7Theme();
        InitializeComponent();
    }

    public static void EnsureApplicationResources()
    {
        if (Application.Current == null)
        {
            // create the Application object
            new App {ShutdownMode = ShutdownMode.OnExplicitShutdown};                                
        }
    }

    protected override void OnExit(ExitEventArgs e)
    {
        if(Current != null)
            Current.Shutdown();

        base.OnExit(e);
    }
}

在Main.cs或Program.cs中的启动方法:

private static void Main()
{
// Your initialization code

//WPF instance start
                App.EnsureApplicationResources();

                Application.Run(MainForm.Instance);
}