2015-02-02 3 views
0

Я относительно новый пользователь 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"); 

ответ

0

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

<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="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Background="{TemplateBinding Background}"> 
        <ContentPresenter HorizontalAlignment="Center" 
         VerticalAlignment="Center" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Здесь ширина и высота не устанавливается с помощью стиля, так что вам больше не нужно устанавливать эти свойства в коде. Шаблон управления был изменен, поэтому он состоит только из элемента Border с содержимым внутри него. Триггеров вообще нет, поэтому при щелчке или зависании кнопка не изменит свой внешний вид.

В вашем коде все, что вам нужно сделать, это получить ссылку на этот стиль, а затем назначить это свойство Style, когда вы создаете кнопку.

Сказав все это, в WPF вам редко нужно создавать элементы управления в коде.Вместо этого вы действительно должны использовать шаблон MVVM (Model-View-ViewModel) и привязку данных. Вы, вероятно, также не должны создавать стили и сеттеры в коде.

+0

Это сделало трюк, спасибо. Скажите, что я хотел добавить триггер, будет ли он выглядеть примерно так? ' ' Ничего похожего не происходит, когда я вставляю это в стиль. –

+0

Вы хотите добавить триггеры, подобные этому, в коллекцию триггеров * стиля *, а не в * шаблоне управления *. Другими словами, '

+0

Я реализовал то, что вы предложили, и из того, что я могу сказать, срабатывает триггер, как предполагалось, однако свойство BorderBrush либо не изменяется, либо изменение не отражается. Даже явно задавая его значение в объявлении стиля, он ничего не делает. Является ли это переопределяемым чем-то? –

Смежные вопросы