Совместите два фрагмента текста по отдельности в кнопке WPF - PullRequest
1 голос
/ 09 августа 2011

У меня есть достаточно простая кнопка ControlTemplate для стилизации кнопки.Меня попросили выровнять часть текста для кнопки справа от кнопки.Поэтому часть текста будет выровнена по левому краю, а часть по правому.Указатель на подход для этого был бы оценен.Это то, что я имею до сих пор:

<ControlTemplate x:Key="ListItemNameTemplate" TargetType="Button">
        <Grid Height="40">           

            <Border Width="200" 
                    x:Name="BgEnabled"                                                  
                    HorizontalAlignment="Center" 
                    Margin="1,1,1,1"
                    Background="YellowGreen">   

                <StackPanel Orientation="Vertical">
                    <TextBlock Width="150"
                               x:Name="textBlock" 
                               Text="{TemplateBinding Content}" 
                               HorizontalAlignment="Left" 
                               VerticalAlignment="Center" 
                               Foreground="White" 
                               FontSize="24"
                               FontWeight="Bold"/>

                    <TextBlock Width="50"                             
                               x:Name="textBlock1" 
                               Text="{TemplateBinding Content}" 
                               HorizontalAlignment="Right" 
                               VerticalAlignment="Center" 
                               Foreground="White" 
                               FontSize="24"
                               FontWeight="Bold"/>
                </StackPanel>
            </Border>
        </Grid>
    </ControlTemplate>

однако: a.Второй текстовый блок не отображается.б.Мне нужно указать содержимое для второго текстового блока иначе, чем «Контент».

Ответы [ 3 ]

2 голосов
/ 10 августа 2011

Вы можете создать подкласс Button, чтобы ввести новое свойство зависимостей для текста, выровненного по правому краю, однако вы застрянете со свойством Content (вы можете создать два новых свойства и вызвать исключение, если установлена ​​Contentхотя).

Чтобы получить верный макет, вы должны либо использовать Dockpanel ( док влево и вправо, LastChildFill установитьдо false) или Grid (с тремя столбцами, середина занимает покой, левый и правый размеры автоматически).

1 голос
/ 12 августа 2011

Маршрут с прикрепленной недвижимостью, безусловно, был способом решения этой проблемы.Новая тема для меня и примеры не работают для меня.Шаблон элемента управления не смог распознать новое свойство.Сработавшее изменение было способом изменить способ определения присоединенного свойства.

Благодаря этой статье за ​​указатель: http://www.deepcode.co.uk/2008/08/exposing-new-properties-for-control_15.html

public class MyButtonThing : DependencyObject
{
  public static readonly DependencyProperty SubTextProperty =
    DependencyProperty.RegisterAttached("SubText",
      typeof(String), typeof(MyButtonThing),
      new FrameworkPropertyMetadata(null,
        FrameworkPropertyMetadataOptions.AffectsMeasure |
        FrameworkPropertyMetadataOptions.AffectsArrange));

  public static void SetSubText(UIElement element, object o)
  {
    element.SetValue(SubTextProperty, o);
  }

  public static string GetSubText(UIElement element)
  {
    return (string)element.GetValue(SubTextProperty);
  }
}
1 голос
/ 10 августа 2011

Вот так:

<Window.Resources>
    <ControlTemplate TargetType="{x:Type Button}" 
                     x:Key="MyButtonTemplate">
        <Border>
            <DockPanel LastChildFill="True">
                <TextBlock Text="{TemplateBinding Content}"
                           DockPanel.Dock="Top"/>
                <TextBlock Text="{TemplateBinding Content}"
                           TextAlignment="Right" />
            </DockPanel>
        </Border>
    </ControlTemplate>
</Window.Resources>

<Button Template="{StaticResource MyButtonTemplate}">
    Hello World
</Button>

Похоже:

enter image description here

Если вы хотите, чтобы второй текст отличался, просто создайте второе свойство.Я бы создал прикрепленное свойство зависимостей, чтобы вы все еще могли использовать TextBox без необходимости создавать его подклассы и испортить все элементы пользовательского интерфейса в вашем проекте.Используйте фрагмент "propa", чтобы начать работу в Visual Studio.Это просто.Смотрите здесь: http://msdn.microsoft.com/en-us/library/ms749011.aspx

Как это:

public class MyButtonThing
{
    public static string GetText2(DependencyObject obj)
    {
        return (string)obj.GetValue(Text2Property);
    }
    public static void SetText2(DependencyObject obj, string value)
    {
        obj.SetValue(Text2Property, value);
    }
    public static readonly DependencyProperty Text2Property =
        DependencyProperty.RegisterAttached("Text2", 
        typeof(string), typeof(System.Windows.Controls.Button));
}

И это:

<Window.Resources>
    <ControlTemplate TargetType="{x:Type Button}" 
                     x:Key="MyButtonTemplate">
        <Border>
            <DockPanel LastChildFill="True">
                <TextBlock Text="{TemplateBinding Content}"
                           DockPanel.Dock="Top"/>
                <TextBlock TextAlignment="Right"  Text="{Binding 
                    RelativeSource={RelativeSource AncestorType=Button},
                    Path=(local:MyButtonThing.Text2)} " />
            </DockPanel>
        </Border>
    </ControlTemplate>
</Window.Resources>

<Button Template="{StaticResource MyButtonTemplate}"
        local:MyButtonThing.Text2="Where's Waldo">
    Hello World
</Button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...