2016-08-09 102 views
0

Ich habe eine benutzerdefinierte Schaltfläche für meine App erstellt, im Inhalt hat es eine Textblock und eine SymbolIcon, beide in einem Grid platziert. Dies ist der sehr einfache CodeFehler beim Laden Benutzerdefiniertes Benutzersteuerelement

<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> 

Und in seiner Klasse Datei, habe ich ein paar Eigenschaften erklärt:

  1. SymbolIcon im Grunde setzt das Symbol Eigentum der SymbolIcon
  2. Text Sets die Text Eigentum der Textblock
  3. Click Sätze th e Click Ereignishandler für das Button

Dies ist der Code hinter:

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; 
    } 
} 

ich alle die sie mit ihren DependencyProperty.Register Funktion

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)); 

Ich glaube, ich habe registriert hab alles gemacht, oder? Also, wenn ich den Namespace in meine Seite und versuchen, die Last, die es, wie diese

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

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

der Designer nicht einmal laden, fügen und es gibt mir diese

System.Runtime.Remoting .RemotingException [9652] Designer-Prozess wurde unerwartet beendet!

Auch der Debugger stürzt ab, wenn die Seite geladen werden muss.

+0

UWP oder WPF? Es kann nicht beides sein. – Clemens

+0

"Ich denke, ich habe alles gemacht, oder?" Nicht genau. Sie sollten nichts anderes als 'SetValue' in der Setter-Methode des CLR-Wrappers einer Abhängigkeitseigenschaft, z. Rufen Sie 'TextBlockColumn.Text = Wert;' nicht auf. Stattdessen sollten Sie die Text-Eigenschaft des TextBlocks an die Text-Eigenschaft Ihres Benutzersteuerelements binden. Gleiches gilt für SymbolIcon. – Clemens

+0

Danke. Es ist übrigens UWP, wie binde ich die Text-Eigenschaft korrekt? –

Antwort

0

Dank @Clemens habe ich den Code korrigiert, indem die unnötigen Anweisungen und die EventHandler-Eigenschaft Click entfernt wurden. Ein EventHandler kann nicht als DependencyProperty hinzugefügt werden, damit die alle Debug Krachen und alle diese Ausnahme zu werfen. Ich finde immer noch heraus, wie ich es hinzufügen werde.

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

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

Außerdem habe ich auf die Symbol Eigenschaften s TextBlock Bindung 's Text und SymbolIcon'. Ich habe dies getan, indem ein x:Name auf den Usercontrol geben (MyButton) und Binden die Eigenschaft mit der Zeichenfolge {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}"/>