Ich habe eine Schaltfläche in einem Control. Wie bekomme ich einen Verweis auf sie?

StackOverflow https://stackoverflow.com/questions/184871

  •  06-07-2019
  •  | 
  •  

Frage

Ich möchte nur aktivieren oder die Taste in einem Control für einen WPF-Editor zu deaktivieren, die ich verwende.

War es hilfreich?

Lösung

ich mit Joel darüber einig, dass die bevorzugte Methode die Einstellung der Schaltfläche Enabled-Eigenschaft mit XAML-Markup, entweder durch einen Trigger oder durch Bindung den Wert Enabled auf eine andere Abhängigkeitseigenschaft, möglicherweise auf einem übergeordneten Element, wahrscheinlich mit der auszulösen wäre Hilfe eines Valueconverter.

Wenn Sie jedoch explizit in C # zu tun haben, können Sie den Findname () -Methode auf der Vorlage Eigenschaft der Schaltfläche verwenden. Es gibt eine MSDN 'wie' hier verknüpft.

Andere Tipps

Mein Ich empfehle, dass Tasten leicht durch RoutedUICommands gesteuert werden - auch leicht ermöglichen und sie zu deaktivieren. Befehle müssen nicht jede Art von Hinweis auf die Schaltfläche so das Ihr Problem löst, zu.

Sehen Sie hier:

<Window.CommandBindings>
    <CommandBinding 
        Command="{x:Static local:MyCommands.MyCommand}"
        Executed="CommandBinding_Executed"
        CanExecute="CommandBinding_CanExecute" />
</Window.CommandBindings>

<Window.Resources>
    <ControlTemplate x:Key="MyTemplate" TargetType="Label">
        <Button Command="{x:Static local:MyCommands.MyCommand}">
            <TextBlock>
                Click Me
                <TextBlock Text="{TemplateBinding Content}" />
            </TextBlock>
        </Button>
    </ControlTemplate>
</Window.Resources>

<StackPanel>
    <Label Template="{StaticResource MyTemplate}">1</Label>
    <Label Template="{StaticResource MyTemplate}">2</Label>
    <Label Template="{StaticResource MyTemplate}">3</Label>
    <Label Template="{StaticResource MyTemplate}">4</Label>
    <Label Template="{StaticResource MyTemplate}">5</Label>
</StackPanel>

verwenden:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void CommandBinding_CanExecute(object sender, System.Windows.Input.CanExecuteRoutedEventArgs e)
    {
        // your logic here
        int _Integer = -1;
        int.TryParse(e.Parameter.ToString(), out _Integer);
        e.CanExecute = _Integer % 2 == 0;
    }

    private void CommandBinding_Executed(object sender, System.Windows.Input.ExecutedRoutedEventArgs e)
    {
        // do something when clicked
    }
}

public static class MyCommands
{
    public static RoutedUICommand MyCommand = new RoutedUICommand();
}

Sieht aus wie:

Screenshot

Sie sollten wirklich nicht explizit tun, dass sein, sondern es mit Triggern im ControlTemplate selbst werden zu setzen. Diese Trigger würde zu einem anderen ändern werden reagieren und würde die Enabled Eigenschaft des Button gesetzt.

Ich hatte ein Problem mit den Tasten in Control & Datatemplates. Ich finde Auslöser oft zu umständlich sind genau das, was meine Kunden wollen, ich mit zu vielen Konvertern endete. Das Verfahren war ich zunächst versucht, diese schwierigen Vorlagen inline zu definieren, so dass sie auf Befehle gebunden werden können (& Code-Behind-Ereignisse) auf meinem Bildschirm Ansichtsmodell.

Wenn Sie eine eigene Kontrolle sind Templating, sollte ich die einfachste Methode erwähnen ist einfach die Taste nennen dann so etwas wie folgt verwenden:

hourHand   = this.Template.FindName( "PART_HourHand",   this ) as Rectangle;

jedoch Vor kurzem habe ich Takt geändert (zurück zum indevidual Dateien .. RE-USE!), Sondern begann ein Ansichtsmodell Zugabe (von Sorten), die ich ...TemplateCommandStore an alle meine Vorlagen Suffix, das ein wenig komplex. Ich selbst diese verwenden, wenn meine Custom Templating (für Konsistenz, meist)

public class BookingDetailsTemplateCommandStore
{
    public OpenWindowCommand_Command OpenWindowCommand_Command { get; set; }

    public BookingDetailsTemplateCommandStore()
    {
        OpenWindowCommand_Command = new OpenWindowCommand_Command( this );
    }       
}

Ich kann dann glücklich diesen Befehl in einer Vorlage. Sie können auch Steuerreferenzen in den Befehlsspeicher übergeben, indem eine Bindung (dependancy?) Eigenschaft es Veranstaltungen und Verbrauch eine präzisere Kontrolle über Ihre Vorlagen zu erfassen.

<DataTemplate DataType="{x:Type LeisureServices:BookingSummary}">
    <Border Height="50" otherStyling="xyz">
        <Border.Resources>
            <local:BookingDetailsTemplateCommandStore x:Key="CommandStore" />
        </Border.Resources>
        <DockPanel>
            <Button otherStyling="xyz"
                    Command="{Binding Source={StaticResource CommandStore},
                                      Path=OpenWindowCommand_Command}" />

MVVM: Ich finde, dass so lange wie grafische Logik ist nur, dass und völlig verschieden von Business-Logik, diese Methode nicht mit MVVM nicht stört. Im Wesentlichen füge ich konsistente C # -Code-Fähigkeit zu Vorlagen, die alle, die zu viel Zeit in winforms verbrachten könnte so viel vermissen wie ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top