لدي زر داخل ControlTemplate. كيف يمكنني الحصول على مرجع إلى ذلك؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأريد فقط لتمكين أو تعطيل زر داخل ControlTemplate لمحرر WPF أنني أستخدم.

هل كانت مفيدة؟

المحلول

وأنا أتفق مع جويل أن الأسلوب المفضل سيكون لتحريك وضع الملكية الزر ممكن مع الترميز XAML، إما عن طريق مشغل أو عن طريق ربط قيمة ممكن إلى خاصية تبعية أخرى، ربما على العنصر الأصلي، من المحتمل مع مساعدة من ValueConverter.

ولكن، إذا كان لديك للقيام بذلك بشكل واضح في C #، يمكنك استخدام الأسلوب FindName () على الممتلكات القالب الزر. هناك من MSDN 'كيف' يرتبط هنا .

نصائح أخرى

وبلدي أوصي بأن الأزرار وتسيطر بسهولة من خلال RoutedUICommands - بما في ذلك تمكين بسهولة وتعطيلها. الأوامر لا تحتاج إلى أي نوع من الإشارة إلى زر لذلك هذا لا يحل مشكلتك، أيضا.

وانظر هنا:

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

استخدم هذا:

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

ويبدو:

وكنت حقا لا ينبغي أن يفعل ذلك صراحة، ولكن بدلا من ذلك وضع مع المشغلات في ControlTemplate نفسها. ومن شأن هذه المشغلات أن تتفاعل مع بعض التغيير الآخر، وسيكون تعيين الخاصية Enabled من Button.

وكان لي مشكلة مع أزرار في controlTemplates وdataTemplates. أجد مشغلات غالبا ما تكون مرهقة جدا لتقديم بالضبط ما يريده موكلي، انتهى بي الأمر مع الكثير من المحولات. كانت الطريقة حاولت أولا أن تحدد هذه القوالب أكثر صعوبة مضمنة بحيث يمكن بد أن الأوامر (والأحداث codebehind) على بلدي شاشات ViewModel.

وإذا كنت النموذجيه التحكم الخاصة بك، وأود أن أذكر أن أسهل طريقة هي مجرد تسمية الزر ثم استخدام شيء مثل هذا:

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

ولكن في الآونة الأخيرة، لقد تغيرت براعة (العودة إلى الملفات indevidual .. RE-USE!) ولكن التي إضافة ViewModel (من نوع) وأنا لاحقة ...TemplateCommandStore إلى كل ما عندي من القوالب التي تحصل معقدة بعض الشيء. حتى أنا استخدم هذا عندما النموذجيه customcontrols بلدي (من أجل التناسق، في الغالب)

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

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

وبعد ذلك يمكنني أن بسعادة استخدام هذا الأمر في قالب. يمكنك أيضا تمرير إشارات التحكم في مخزن الأوامر الملزمة ل(التبعية؟) الخاصية للالتقاط الأحداث والمكوس التحكم بدقة أكثر النماذج الخاصة بك.

<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: أجد أنه طالما المنطق رسومية ليست سوى ذلك، وتختلف تماما عن منطق الأعمال، هذه المنهجية لا تتداخل مع MVVM. في جوهر I إضافة متسقة C # رمز القدرة على قوالب، الذي لمن أمضى الكثير من الوقت في WinForms عناصر قد يغيب بقدر ما أقوم به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top