2015-01-26 2 views
2

Я делаю программу с кнопками, имеющими 2 текстовых блока: 1 слева, который содержит имя пользователя, а другой справа - «Начало» И эти кнопки добавляются для каждый зарегистрированный пользователь.Наследующая кнопка WPF и добавление в нее дополнительных текстовых блоков

У меня есть два проекта в этом решении: Один (VB.NET) в качестве основной программы, а другой (C#) как CustomControlLibrary ...

Теперь я хочу, чтобы сделать эту пользовательскую кнопку в Пользовательском Библиотека управления ... Я пытаюсь создать новый пользовательский контроль и изменил ": Control" в ": Кнопка"

Generic.xaml 

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:LC_Lib.LC_Controls"> 


    <Style TargetType="{x:Type local:UserSelectButton}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:UserSelectButton}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="Black" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
          <TextBlock Name="txtb_user"></TextBlock> 
         </Grid> 
        </Border> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

C# 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace LC_Lib.LC_Controls 
{ 
    public class UserSelectButton : Button 
    { 
     private string u_name = ""; 
     static UserSelectButton() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(UserSelectButton), new FrameworkPropertyMetadata(typeof(UserSelectButton))); 
     } 
     public string UserName 
     { 
      get { return u_name; } 
      set { u_name = value; } 
     } 
    } 
} 

VB.NET 

    For Each user In users_list 
     Dim user_btn As New UserSelectButton 

     user_btn.UserName = user.Name 
     Dim top As Double = users_list.IndexOf(user) * 40 + 20 
     user_btn.Margin = New Thickness(20, top, 0, 75) 
     user_btn.Tag = users_list.IndexOf(user) 
     AddHandler user_btn.Click, Sub(s, a) 
             SignIn() 
            End Sub 
    Next 

  • Что я должен сделать для них, чтобы появиться в моей форме? Я не могу их видеть, но когда я нажимаю на них, он на самом деле срабатывает ...
  • Могу ли я добавить два текстовых блока внутри Grid, вставив элементы textblock в рамку в Generic.xaml?
  • Если это так или иначе, как я могу назначить текст текстового блока в свойстве UserName унаследованной кнопки?

ответ

1

Нет надобности наследовать кнопку, вы не меняете ее функциональность? Вы должны просто создать стиль, который устанавливает содержание кнопки и установите его на все ваши кнопки:

<Style TargetType="{x:Type Button}"> 
        <Setter Property="Content"> 
         <Setter.Value> 
          <Border Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}, Path=Background}" 
            BorderBrush="Black" BorderThickness="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}, Path=Background}"> 
           <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
            <TextBlock Name="txtb_user" Text="{Binding UserName"></TextBlock> 
           </Grid> 
          </Border> 
         </Setter.Value> 
        </Setter> 
       </Style> 
+0

но, я буду делать еще одну кнопку, почему бы мне не наследовать ее? Если бы я установил его на все кнопки, разве это не изменило бы его для другого? –

+0

Все преимущество WPF в том, что для большинства применений вам не нужно наследовать элемент управления. у вас есть несколько точек вмешательства, стиль - самый простой, вы также можете создать ControlTemplate, чтобы изменить внешний вид элемента управления, но сохранить его функциональность. Здесь вы просто хотите, чтобы кнопка выглядела определенным образом, этого можно добиться с помощью стиля. –

+0

Возможно, нет, мне нужно будет динамически изменять строку TextBlock с использованием свойства UserName, которое я создал в коде C# ... –

0

Если это так, или по-другому, как я могу назначить текст в TextBlock в свойстве UserName унаследованной кнопки?

Вы можете создать DependencyProperty в вашем UserSelectButton и сделать Binding к нему в вашем стиле XAML с RelativeSource={RelativeSource TemplatedParent} и Mode=TwoWay. Затем вы можете связать что-либо с этим свойством зависимостей.

Смежные вопросы