Я относительно новый пользователь WPF и столкнулся с проблемой динамического создания кнопок и свойств по умолчанию для кнопок.Как изменить поведение мыши по умолчанию на динамически сгенерированных кнопках
В настоящее время я работаю над приложением, в котором значительное количество кнопок генерируется на холсте в коде позади. Содержимое каждой кнопки - это уникальные образы, на которые ссылается массив объектов, содержащих строки Uri. Этот массив заполняется чтением в файле, содержащем эти строки Uri, поэтому число и размещение кнопок на этом холсте различаются в зависимости от того, какой файл читается.
По большей части внешний вид Canvas при запуске приложения - это то, что было предназначено, однако наведение на любую из кнопок заменяет изображение синим фоном по умолчанию на время, на которое накладывается мышь.
Вот пример кода, который я использую для создания кнопок:
exampleButton = new Button { Content = "Name", Width = 50, Height = 65, Background = new ImageBrush(new BitmapImage(new Uri(@object.UriString, UriKind.Relative))) };
exampleButton.Style = exampleStyle;
exampleCanvas.Children.Add(exampleButton);
Пожалуйста, обратите внимание, что я опустил фрагменты кода не имеют отношения к моему вопросу.
Вот пример стиля, который был использован, а также в коде позади:
exampleStyle = new Style(typeof(Button));
exampleStyle.Setters.Add(new Setter(Button.ForegroundProperty, Brushes.Transparent));
exampleStyle.Setters.Add(new Setter(Button.BorderBrushProperty, Brushes.Transparent));
Вместе эти достижения эффекта я пытаюсь создать, если не считать поведение парения.
До сих пор я пытался добавить переопределения ControlTemplate в объявлении стиля, но не уверен, как это переводится с XAML на код C#. Я также попытался создать и привязать шаблоны кнопок, созданные в XAML, но у меня не было успеха в поиске объяснений или руководств, которые применимы к моей ситуации.
Любая помощь для достижения этого с помощью кода позади была бы весьма признательна. Конечно, если я делаю это действительно нетрадиционно, и есть более стандартный способ делать вещи, я все уши.
EDIT: Это XAML, который я использую, чтобы объявить стиль, который используют мои динамически сгенерированные кнопки.
<Style x:Key="MySuperButtonStyle" TargetType="{x:Type Button}">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Width" Value="50" />
<Setter Property="Height" Value="65" />
<Setter Property="Foreground" Value="Transparent" />
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
Используя этот вызов, чтобы назначить стиль в коде позади:
exampleButton.Style = (Style)FindResource("MySuperButtonStyle");
Это сделало трюк, спасибо. Скажите, что я хотел добавить триггер, будет ли он выглядеть примерно так? ' ' Ничего похожего не происходит, когда я вставляю это в стиль. –
Вы хотите добавить триггеры, подобные этому, в коллекцию триггеров * стиля *, а не в * шаблоне управления *. Другими словами, '
Я реализовал то, что вы предложили, и из того, что я могу сказать, срабатывает триггер, как предполагалось, однако свойство BorderBrush либо не изменяется, либо изменение не отражается. Даже явно задавая его значение в объявлении стиля, он ничего не делает. Является ли это переопределяемым чем-то? –