Как переопределить стиль текста в пользовательском пользовательском элементе управления?

#c# #wpf #xaml #custom-controls

#c# #wpf #xaml #пользовательские элементы управления

Вопрос:

  1. У меня есть пользовательский элемент управления, который состоит из. Текстовый блок, содержимое которого привязано к UserLabel b. Текстовое поле, содержимое которого привязано к UserValue .
  2. Когда я добавляю этот пользовательский элемент управления в главное окно, я хочу добавить нижний индекс в UserLabel , но не знаю, как это сделать.
  3. Я хочу сделать что-то вроде этого (СЛЕДУЮЩИЙ КОД НЕ РАБОТАЕТ. ЭТО ТО, ЧТО Я ХОЧУ СДЕЛАТЬ):
 <Window 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:local="clr-namespace:MyNamespace"
  Title="MyControl Sample" 
  Height="300" 
  Width="300">
  <StackPanel>
    <local:MyControl>
        <UserLabel.Text>
            Subscript<Run BaselineAlignment="Subscript" FontSize="12pt">This</Run> 
        <UserLabel.Text>
    <local:MyControl>
  </StackPanel>
</Window>
 
  1. Как я могу добиться чего-то подобного? введите описание изображения здесь
  2. Вот XAML:
 <UserControl x:Class="TEST.MyControl"
             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"              
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800"
             x:Name="parent">
    <StackPanel Width="100" Orientation="Horizontal"                 
                DataContext="{Binding ElementName=parent}">
        
        <!-- User Label -->
        <TextBlock Width="200" Name="UserLabel"                                                        
                   Text="{Binding Path=UserLabel}" >            
        </TextBlock>
        
        <!-- User Input -->
        <TextBox Width="100" Name="MetricValue"                  
                 Text="{Binding Path=UserValue}"/>
        
    </StackPanel>
</UserControl>

 
  1. и вот КОД, ЛЕЖАЩИЙ В ОСНОВЕ:
 /// <summary>
    /// Interaction logic for MyControl.xaml
    /// </summary>
    public partial class MyControl: UserControl
    {
        public MyControl()
        {
            InitializeComponent();
        }

        #region User Label DP
        public static readonly DependencyProperty UserLabelProperty =
            DependencyProperty.Register("UserLabel",
                typeof(string),
                typeof(MyControl),
                new PropertyMetadata(""));
        public string UserLabel
        {
            get { return GetValue(UserLabelProperty) as String; }
            set { SetValue(UserLabelProperty, value); }
        }
        #endregion // User Label DP

        #region UserValue DP
        public static readonly DependencyProperty UserValueProperty =
            DependencyProperty.Register("UserValue",
                typeof(string),
                typeof(MyControl),
                new PropertyMetadata(""));
        public string UserValue
        {
            get { return GetValue(UserValueProperty) as String; }
            set { SetValue(UserValueProperty, value); }
        }
        #endregion // UserValue DP        
    }
 

Комментарии:

1. Сделать UserLabel a TextBlock вместо a string , у которого нет понятия Run элементов?

2. Спасибо. Но, если я создам UserLabel TextBlock , как мне использовать его в MainWindow.xaml ? Как мне передать строку в UserLabel ?

3. Пожалуйста, обратитесь к моему ответу для примера.

Ответ №1:

Сделайте UserLabel a TextBlock вместо a string , у которого нет понятия Run элементов:

 #region User Label DP
public static readonly DependencyProperty UserLabelProperty =
    DependencyProperty.Register("UserLabel",
        typeof(TextBlock),
        typeof(MyControl));

public TextBlock UserLabel
{
    get { return GetValue(UserLabelProperty) as TextBlock; }
    set { SetValue(UserLabelProperty, value); }
}
#endregion // User Label DP
 

UserControl XAML:

 <!-- User Label -->
<ContentControl Width="200" Content="{Binding UserLabel, ElementName=parent}" />
 

Window XAML:

 <StackPanel>
    <local:MyControl>
        <local:MyControl.UserLabel>
            <TextBlock>
                <Run FontSize="12pt">Subscript</Run>
                <Run BaselineAlignment="Subscript" FontSize="12pt">This</Run>
            </TextBlock>
        </local:MyControl.UserLabel>
    </local:MyControl>
</StackPanel>