WPF контроля доступа в <ResourceDictionary> - PullRequest
1 голос
/ 13 мая 2009

Я пытаюсь получить доступ к кнопке в файле .xaml в коде позади файла моего MainWindow.xaml. Я пытался использовать x: Class в файле, но когда я его использую, кнопка работает, но я получаю много других ошибок. поэтому я предпочитаю не использовать этот метод.

Существуют ли другие способы доступа к элементам управления в шаблоне из класса mainWindows.

код:

<ResourceDictionary xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
                xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
                xmlns:l="clr-namespace:Avalon.Demo" x:Class="Bildbanken.MainWindow">

                        <!-- Taggarnas placering under bilderna (Left/ Top/ Right/ Bottom) -->
                        <Label Content="{Binding Type}" Padding="0,5,7,0" HorizontalAlignment="Right" />
                        <Label Content="{Binding Category}" Padding="7,0,0,0" />
                        <ListBox Name="ArtInfo" ItemsSource="{Binding Articles}" BorderThickness="0" Background="{TemplateBinding Background}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="115px" />
                                            <ColumnDefinition Width="auto" />
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Grid.Column="0" Text="{Binding Artnr}"></TextBlock>
                                        <Button HorizontalAlignment="Right" Name="testbutton" Grid.Column="1">--</Button>
                                    </Grid>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>

Ответы [ 4 ]

0 голосов
/ 29 ноября 2010

Если вам требуется код для содержимого шаблона, обычно рекомендуется перенести содержимое шаблона в пользовательский элемент управления. (И это часто хорошая идея, даже если вам не нужен кодовый код).

Этот ответ на другой вопрос иллюстрирует технику. (Этот вопрос может показаться неактуальным, но в ответе использовался тот же подход, который я защищаю здесь. В этом примере используются иерархические шаблоны, но он также применим к обычным.)

Пользовательские элементы управления предлагают здесь два преимущества. Во-первых, они помогают избежать чрезмерно сложных файлов Xaml - для шаблонов легко доминировать над файлом Xaml, если оставить их тела встроенными, а не разделять их на свои собственные файлы. Во-вторых, вы можете легко использовать codebehind.

Тем не менее, я согласен с различными другими ответами здесь, которые в первую очередь отстаивают необходимость избегать кода. (Я не совсем согласен с их конкретными решениями - я использую командный подход, но я не использую RoutedCommand - я использую пользовательскую реализацию ICommand, которая следует шаблону, обычно называемому DelegatingCommand или RelayCommand.) Но даже тогда я все еще почти определяю тела шаблонов как пользовательские элементы управления, просто чтобы упростить Xaml.

0 голосов
/ 14 мая 2009

Вы можете указать RoutedCommand, который вы можете добавить через CommandBinding к вашему DataTemplate и к кнопке. Таким образом, вы можете обрабатывать нажатие кнопки / выполнение команды, например, в следующем коде, и вам не нужно находить кнопку через VisualTreeHelper (или мой совет будет SomeElement.TryFindResource ("ButtonKey")).

Понятно, что я имею в виду, или я не понял, что вы хотите сделать с вашей кнопкой?

0 голосов
/ 19 июля 2009

Сначала создайте файл .cs, где вы регистрируете свои команды. Это может быть названо MyCommandCollection.cs. В этом классе вы определяете и регистрируете свой RoutedCommand с помощью:

   public static readonly RoutedCommand ButtonPressCommand= new RoutedCommand("ButtonPress", typeof(MyCommandCollection));

Вы определяете Команду в UserControl или в Окне, в котором вы хотите ее использовать, например.

<UserControl.CommandBindings>
     <CommandBinding Command="Commands:MyCommandCollection.ButtonPressCommand" Execute="Execute_ButtonPressCommand" ... />
</UserControl.CommandBindings>

В коде вашего UserControl / Window вы реализуете методы Execute / CanExecute своей команды.

Таким образом, вы можете использовать его также в ResourceDictionary, например так:

<Button Command="Commands:MyCommandCollection.ButtonPressCommand" />

Не забудьте также поместить пространства имен вашего "MyCommandCollectionClass.cs" в UserControl / Window и ResourceDictionary, например:

xmlns:Commands="clr-namespace:MyApp.SomeFolder.Commands"

Надеюсь, это поможет.

0 голосов
/ 13 мая 2009

Возможно получить доступ к содержимому таблички данных. Вы можете получить корневой элемент шаблона следующим образом:

UIElement templateRoot = listbox.ItemTemplate.LoadContent() as UIElement;

Оттуда вы используете VisualTreeHelper для поиска элемента управления Button.

Если вы просто хотите обработать нажатие кнопки, лучше использовать RoutedEvents из WPF.

AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click));

Это будет захватывать каждое нажатие кнопки, независимо от источника. Если вы даете кнопке метку или что-то еще, вы можете проверить это, чтобы отфильтровать только те кнопки, которые вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...