Дублирование кнопки и добавление ее в панель документооборота в WPF / C # - PullRequest
0 голосов
/ 28 ноября 2011

Я пытаюсь добавить кнопку к моему DockPanel динамически. Мне нужно создать ту же кнопку, которая существует в моей док-панели.

<Button Name="ImageMoreButton"
             DockPanel.Dock="Right"
             Command="{Binding LaunchLookup}" 
             Style="{StaticResource ButtonStyle}"
             Margin="2,0,2,0"
             Padding="3"
             Visibility="{Binding Definition.IsLookupImageButton, Converter={StaticResource boolToVisibilityConverter}}"
             IsEnabled="{Binding Locked, Converter={StaticResource invertedBooleanConverter}}">
             <Image Name="button_image" Source="search_button_rest.png"/>
</Button>

Вот мой код C #.

d.Name = VariableArg.Name + index;
d.Margin = VariableArg.Margin;

item.Command = ImageMoreButton.Command;
item.Style = ImageMoreButton.Style;
item.Name = ImageMoreButton.Name + index;
item.Visibility = ImageMoreButton.Visibility;
item.Padding = ImageMoreButton.Padding;
item.Margin = ImageMoreButton.Margin;
item.IsEnabled = ImageMoreButton.IsEnabled;
item.Height = ImageMoreButton.ActualHeight;
item.Width = ImageMoreButton.ActualWidth;
DockPanel.SetDock(item, Dock.Right);

Дайте мне знать, если это правильный путь к этому.

Ответы [ 3 ]

1 голос
/ 29 ноября 2011

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

При этом, поскольку ваши кнопки представляют параметр конфигурации, я бы порекомендовалвы используете что-то вроде ItemsControl, которое связано с набором объектов данных, а Button используется как ItemTemplate.

Например, предположим, что у вас есть коллекция ObservableCollection<MySetting> с именем Settings.Затем вы могли бы написать следующий XAML:

<ItemsControl ItemsSource="{Binding Settings}">

    <!-- ItemsPanelTemplate -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <DockPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <!-- ItemContainerStyle -->
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="DockPanel.Dock" Value="Right" />
        </Style>
    </ItemsControl.ItemContainerStyle>

    <!-- ItemTemplate -->
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Command="{Binding DataContext.LaunchLookup, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" 
                    Style="{StaticResource ButtonStyle}"
                    Margin="2,0,2,0"
                    Padding="3"
                    Visibility="{Binding Definition.IsLookupImageButton, Converter={StaticResource boolToVisibilityConverter}}"
                    IsEnabled="{Binding Locked, Converter={StaticResource invertedBooleanConverter}}">
                 <Image Source="search_button_rest.png"/>
            </Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Затем, чтобы добавить новые элементы, вы просто добавили бы элементы в ObservableCollection

Settings.Add(new MySetting());

Для других примеров используйте ItemsControl этот пост я написал

0 голосов
/ 28 ноября 2011

Говоря о "лучшем способе", я рекомендую вам познакомиться с MVVM Pattern , поскольку он очень эффективен в упрощении кода пользовательского интерфейса.Кроме того, кажется, что это широко распространенная лучшая практика для программирования WPF, так как WPF имеет отличную инфраструктуру для этого.Конечно, есть кривая обучения, но как только вы поймете это, вы легко решите такие головоломки.Я мог бы предоставить пример, но я не уверен, что он будет полезен здесь.

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

parentPanel.Children.Add(item);
0 голосов
/ 28 ноября 2011

Если вы часто используете этот код, я предлагаю вам определить метод расширения в классе Button.как это:

  public static class ButtonExtension
    {
        public static Button Clone(this Button myButton, int index)
        {
            var newButton = new Button
                                {
                                    Command = myButton.Command,
                                    Style = myButton.Style,
                                    Name = myButton.Name + index,
                                    Visibility = myButton.Visibility,
                                    Padding = myButton.Padding,
                                    Margin = myButton.Margin,
                                    IsEnabled = myButton.IsEnabled,
                                    Height = myButton.ActualHeight,
                                    Width = myButton.ActualWidth
                                };
              return newButton;
        }
    }

, который вы можете использовать позже как:

  var newButton = ImageMoreButton.Clone(index);
  DockPanel.SetDock(newButton, Dock.Right);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...