2016-08-09 6 views
0

Я создал пользовательскую кнопку для своего приложения, в содержании у нее есть Textblock и SymbolIcon, оба помещенные в Grid. Это очень простой кодОшибка при загрузке Пользовательский UserControl

<UserControl 
    ...> 

     <Grid> 
      <Button Name="ButtonControl"> 
       <Button.Content> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition /> 
          <ColumnDefinition /> 
         </Grid.ColumnDefinitions> 

         <SymbolIcon Grid.Column="0" 
            Symbol="Italic" 
            Name="SymbolIconColumn" 
            /> 
         <TextBlock Grid.Column="1" 
            Text="" 
            Name="TextBlockColumn" 
            /> 
        </Grid> 
       </Button.Content> 
      </Button> 
     </Grid> 

</UserControl> 

И в своем классе файл, я объявил несколько свойств:

  1. SymbolIcon в основном устанавливает Symbol свойство SymbolIcon
  2. Text наборы имущество TextTextblock
  3. Click комплекты th е Click событие Обработчик Button

на это код позади:

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

public Symbol SymbolIcon 
{ 
    get 
    { 
     return (Symbol)GetValue(SymbolIconProperty); 
    } 
    set 
    { 
     SetValue(SymbolIconProperty, value); 
    } 
} 


public RoutedEventHandler Click 
{ 
    get 
    { 
     return (RoutedEventHandler)GetValue(ClickProperty); 
    } 
    set 
    { 
     SetValue(ClickProperty, value); 
     ButtonControl.Click += value; 
    } 
} 

public RoutedEventHandler Click 
{ 
    get 
    { 
     return (RoutedEventHandler)GetValue(ClickProperty); 
    } 
    set 
    { 
     SetValue(ClickProperty, value); 
     ButtonControl.Click += value; 
    } 
} 

Я зарегистрировал все они со своей функцией DependencyProperty.Register

public static readonly DependencyProperty SymbolIconProperty = 
      DependencyProperty.Register("SymbolIcon", typeof(Symbol), 
       typeof(TimerButton), new PropertyMetadata(Symbol.Italic)); 

public static readonly DependencyProperty TextProperty = 
      DependencyProperty.Register("Text", typeof(string), 
       typeof(TimerButton), new PropertyMetadata("")); 

public static readonly DependencyProperty ClickProperty = 
      DependencyProperty.Register("Click", typeof(RoutedEventHandler), 
       typeof(TimerButton), new PropertyMetadata(null)); 

Я думаю, что я Все сделано, верно? Так что, если я добавить пространство имен в мою страницу и попробуйте загрузить его, как этот

<Page 
    ... 
    xmlns:bt="using:MyProject.Resources"...> 

<bt:TimerButton 
       SymbolIcon="Accept" 
       Text="Accept" 
       /> 

дизайнер даже не загрузится, и это дает мне этот

system.runtime.remoting .RemotingException [9652] Процесс конструктора неожиданно прекратился!

Кроме того, отладка сбрасывается, когда страница загружается.

+0

UWP или WPF? Это не может быть и то, и другое. – Clemens

+0

«Думаю, я все сделал, верно?» Не совсем. У вас не должно быть ничего, кроме 'SetValue' в методе setter оболочки CLR свойства зависимости, например. не вызывать 'TextBlockColumn.Text = значение;'. Вместо этого вы должны привязать свойство TextBlock Text к свойству Text вашего UserControl. То же самое для SymbolIcon. – Clemens

+0

Спасибо. Это UWP, кстати, Как связать свойство Text правильно? –

ответ

0

Благодаря @Clemens, я исправил код, удалив ненужные инструкции, а также свойство Click EventHandler. EventHandler не может быть добавлен как DependencyProperty, таким образом, все сбои отладки и все это исключение. Я все еще понимаю, как я это добавлю.

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

public Symbol Icon 
{ 
    get 
    { 
     return (Symbol)GetValue(SymbolIconProperty); 
    } 
    set 
    { 
     SetValue(SymbolIconProperty, value); 
    } 
} 

Я также добавил Связывание Symbol свойств TextBlock 'S Text и SymbolIcon' S. Я сделал это, давая x:Name к UserControl (MyButton) и обязательное свойство со строкой {Binding Path=/*name of the property of the UserControl to bind*/, ElementName="MyButton"

<UserControl 
... 
x:Name="MyButton"> 
.... 
.... 
<!--only showing for the TextBlock, but I've done the same for the SymbolIcon--> 
<TextBlock Grid.Column="1" 
      Text="{Binding Path=ButtonText,ElementName=MyButton}"/> 
Смежные вопросы