在WPF中使用2个TextBlock创建UserControl

时间:2017-02-28 04:54:59

标签: wpf xaml data-binding

我想创建一个UserControl,其中TextBlock作为标题,另一个TextBlock作为内容

HeaderTextBlock.xaml

<UserControl x:Class="GetPageDataFacebookAPI.HeaderTextBlock"
             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" 
             xmlns:local="clr-namespace:GetPageDataFacebookAPI"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Header" Opacity=".6" Margin="5" />
        <TextBlock Text="Text" Margin="5" />
    </StackPanel>
</UserControl>

但是如何使用它并将值绑定到Header和Content TextBlock?

<local:HeaderTextBlock Header="..." and Text="..."  />

3 个答案:

答案 0 :(得分:1)

您只需创建依赖项属性即可在代码中公开这些元素。然后,当您在另一个视图中使用该控件时,您可以做到这一点。 为两个TextBlock添加一个名称,然后添加依赖项属性以在后面的代码中更改它们。

<StackPanel Orientation="Horizontal">
    <TextBlock Text="Header"
               Opacity=".6"
               Margin="5" 
               Name="TextBlockHeader"/>
    <TextBlock Text="Text"
               Margin="5" 
               Name="TextBlockText"/>
</StackPanel>

控制背后的代码......

    public string Header
    {
        get { return (string)GetValue(HeaderProperty); }
        set { SetValue(HeaderProperty, value); }
    }

    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.Register(nameof(Header), typeof(string), typeof(HeaderTextBlock), new PropertyMetadata("", (s, e) => (s as HeaderTextBlock).TextBlockHeader.Text = (string)e.NewValue));

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register(nameof(Text), typeof(string), typeof(HeaderTextBlock), new PropertyMetadata("", (s, e) => (s as HeaderTextBlock).TextBlockText.Text = (string)e.NewValue));

然后你可以在另一个视图或控件中使用它,就像这样...也可以使用绑定。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <local:HeaderTextBlock Header="{Binding Header}" Text="Hello WOrld"/>

</Grid>

答案 1 :(得分:0)

  1. 创建两个普通CLR属性,或

  2. 如果您需要DependencyProperty,请创建与HeaderText对应的两个Binding

  3. Tutorial

答案 2 :(得分:0)

您需要创建自定义控件,而不是使用userControl: https://msdn.microsoft.com/en-gb/library/cc295235.aspx