2016-09-13 4 views
0

Ich habe einen Stil:Get Kontrolle von Stil innerhalb Stil

<Style TargetType="TextBox" x:Key="TextBoxStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TextBox"> 
       <Grid> 
        <Button x:Name="Button1" /> 
       </Grid> 
      <ControlTemplate/> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="local:MyControl"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:MyControl"> 
       <Grid> 
        ... 
        <TextBox x:Name="TextBox1" Style="{StaticRessource TextBoxStyle}/> 
        ... 
       </Grid> 
      <ControlTemplate/> 
     </Setter.Value> 
    </Setter> 
</Style> 

das Problem ist, dass ich nicht die "Button1" bekommen kann, Code hinter:

public class MyControl : ItemsSource 
{ 

    private TextBox _textBox1; 
    private Button _button1; 

    protected override void OnApplyTemplate() 
    { 
     _textBox1 = (TextBox)GetTemplateChild("TextBox1"); 

     base.OnApplyTemplate(); 

    } 

} 

In wpf ich tun kann, :

_button1 = (Button)_textBox1.Template.FindName("Button1"); 

Aber die "Findname()" Methode does in UWP existieren, so wie kann ich die Button1 bekommen?

Dankten!

EDIT:

Wenn wir AutoSuggestBox's style schauen wir haben den Stil AutoSuggestBox und die AutoSuggestBoxTextBoxStyle. Die Autosuggestbox löst das Ereignis "QuerySubmitted" aus, das von der Schaltfläche "QueryButton" stammt, die sich in dem AutoSuggestBoxTextBoxStyle befindet. So kann er Zugriff auf den Button haben, oder?

+0

In Code hinter Sie eine Instanz in der gleichen Klasse erstellen. Während im Stil beide Stile unabhängig voneinander sind. Seien Sie genauer, wenn dies Ihre Frage nicht beleuchtet. Spezifischer sein in was erwartest du im Stil? Welchen Stil willst du die Werte bekommen? – Versatile

+0

Ich möchte das gleiche tun wie AutoSuggestBox Hexe das Ereignis der Schaltfläche in AutoSuggestBox Klasse angeklickt ist zu erhöhen, ich habe meinen Beitrag – Caliphe

Antwort

0

Nach Ihrem Code haben Sie eine Templated Kontrolle. GetTemplateChild Methode wird verwendet, um das untergeordnete Element aus der Vorlage abzurufen. Der obige Code Snap ist innerhalb MyControl Klasse und wir können untergeordnetes Element aus der MyControl Vorlage erhalten, wie Sie die TextBox1 zu finden sind. Aber für Button1, es ist nicht in der Vorlage von MyControl (es ist in Vorlage von _textbox1), scheint es, wie wir es nicht bekommen können.

also wie bekomme ich den Button1?

Wir können durch VisualTreeHelper die Button1 nach MyControl gemacht bekommen. Hier ist eine Demo über das Erstellen eines MyControl in MainPage und dann das Button1 Element von VisualTreeHelper.

XAML-Code

<local:MyControl x:Name="mycontrol" Height="200" Width="200"></local:MyControl> 
<Button x:Name="getbutton1" Click='getbutton1_Click' Content="Get button1"></Button> 

-Code hinter

private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    } 

    private void getbutton1_Click(object sender, RoutedEventArgs e) 
    { 
     Button _button1 = null; 
     IEnumerable<Button> buttons = FindVisualChildren<Button>(mycontrol); 
     foreach (var _button in buttons) 
     { 
      if (_button.Name == "Button1") 
      { 
      _button1 = _button; 
      } 
     } 
     System.Diagnostics.Debug.WriteLine(_button1.Content); 
    } 

So kann er den Zugriff auf die Schaltfläche rechts haben?

In diesem Fall überprüfen Sie bitte die QueryButton im Stil, es ist in einem Raster, nicht ein TextBox. Und die "Textbox", die Sie in der AutoSuggestBox gesehen haben, ist eigentlich ein ContentControl, das innerhalb desselben Grid mit QueryButton ist. So kann der Knopf bekommen werden.

+0

edtied Ich wusste schon, diese Methode aber thx für die Antwort :), ich habe meinen Beitrag bearbeitet – Caliphe

+0

@Caliphe, In diesem Fall, überprüfen Sie bitte das 'QueryButton' im Stil, es ist in einem' Grid', kein TextBox. Und die 'Textbox', die Sie in der 'AutoSuggestBox' gesehen haben, ist eigentlich ein 'ContentControl', das sich innerhalb desselben' Grid' mit 'QueryButton' befindet. So kann der Knopf bekommen werden. –

+0

Ok danke! : D ich wusste nicht, dass es ein ContentControl ist, da es den gleichen Namen wie das Steuerelement hat – Caliphe