UserControl包含用于显示内容的更改内容模板

时间:2013-09-27 12:53:56

标签: c# wpf xaml

我有一种情况需要创建一个托管内容演示者的用户控件。现在,内容演示者应该使用模板来显示数据。

我设计了一个用户控件,如下所示。 XAML

<UserControl x:Class="Dashboard.ComponentStatisticsControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         Name="SatisticsControl"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Label Content="{Binding ElementName=SatisticsControl, Path=Title}" 
           Grid.Row="0"
           Background="SkyBlue"/>
        <ContentPresenter Content="{Binding ElementName=SatisticsControl, Path=AdditionalContent}"
                      Grid.Row="1"/>
    </Grid>
</UserControl>

现在我在MainWindow.xaml中定义了一个WrapPanel,它应该托管ComponentStatisticsControl

<Window x:Class="Dashboard.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Dashboard"
    Height="350" Width="525"
    ShowInTaskbar="True"
    WindowState="Maximized"
    WindowStyle="None"
    Name="_this">
    <Window.Resources>
        <LinearGradientBrush x:Key="PanelBackground" 
                         StartPoint="0, 1"
                         EndPoint="1, 0">
            <GradientStop Color="SkyBlue" Offset="0.3"/>
            <GradientStop Color="PaleGreen" Offset="1"/>
        </LinearGradientBrush>
        <SolidColorBrush x:Key="BorderBrush"
                     Color="Blue"/>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0">
            <Button Click="Button_Click"
                HorizontalAlignment="Left"
                VerticalAlignment="Center">Click</Button>
        </StackPanel>
        <WrapPanel Name="WrapPanelMain"
               Orientation="Horizontal"
               FlowDirection="LeftToRight"
               Grid.Row="1">
        </WrapPanel>
    </Grid>
</Window>

现在我在后面的代码中为ComponentStatisticsControl创建内容。

    public void CreateComponent(ref DiscoveryMessage Message)
    {
        switch (Message.Identifier)
        {
            case ComponentIdentifier.Dispatcher:
                {
                    ComponentStatisticsControl StatisticsControl = new ComponentStatisticsControl();
                    StatisticsControl.Title = "Dispatcher";
                    StatisticsControl.AdditionalContent = new Label() { Content = "Hello"};
                    WrapPanelMain.Children.Add(StatisticsControl);
                    break;   
                }
        }
    }

但是,我看不到添加的数据。我错过了什么我花了很多时间来解决出了什么问题。

我应该能够在WrapPanel中看到标签“Hello”的内容集。

public class DispatcherStatistics
{
    private uint f_QCount;

    public uint QueueCount { get { return f_QCount; } 
        set 
        { 
            f_QCount = value;
        } 
    }

}

我将把这个类实例设置为AdditionalContent。因此,每当我分配此类的新实例时,QueueCount都会更新。

提前致谢

EDIT 我在包装面板中获取了我的类类型的文本。现在上面的问题已经解决了,但是如何为要显示的内容定义模板。

    public void CreateComponent(ref DiscoveryMessage Message)
    {
        1switch (Message.Identifier)
        {
            case ComponentIdentifier.Dispatcher:
                {
                    ComponentStatisticsControl StatisticsControl = new ComponentStatisticsControl();
                    StatisticsControl.Title = "Dispatcher";
                    StatisticsControl.AdditionalContent = f_clDispatcherStatistics;
                    WrapPanelMain.Children.Add(StatisticsControl);
                    break;
                }
        }
    }

f_clDispatcherStatistics是DispatcherStatistics类的私有实例变量 这显示“Dashboard.DispatcherStatistics”

我想显示类似

的内容

QueueCount:0

喜欢这种格式。

1 个答案:

答案 0 :(得分:0)

你这样做有点复杂。您可以直接使用Content的{​​{1}}属性。

以下是模板的重要部分(使用默认的UserControl):

ContentPresenter

然后直接使用<Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Label Content="{Binding ElementName=SatisticsControl, Path=Title}" Grid.Row="0" Background="SkyBlue"/> <ContentPresenter Grid.Row="1"/> </Grid> 属性:

Content