2009-06-28 4 views
18

Я хочу глобально деактивировать прямоугольники фокуса в моем приложении WPF. Для отдельных элементов управления, которые могут быть выполнены черезДеактивировать FocusVisualStyle глобально

<Style TargetType="Button"> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
</Style> 

но как применить его ко всем элементам управления в моем приложении. При применении к FrameworkElement ничего не происходит. Мне нужно было бы что-то вроде «применить к классу x и всем производным классам».

Спасибо заранее,

Стефан

ответ

0

Это не может быть простым, но вы можете написать функцию, которая изменяет существующий стиль управления. Как только это будет написано, вы можете написать функцию, которая рекурсивно изменяет стиль каждого элемента.

+0

Почему это сделал получить -1? –

+0

Возможно, потому что это излишне сложное, чреватое такими трудностями, как обеспечение того, что вы покрыли каждый возможный край и достаточно сложно поддерживать, просто чтобы назвать 2. По сравнению с «Style» и «Setter» для каждого типа (что, хотя утомительно, просто), ваше предложение звучит безумно. Я не дал -1. –

+0

Поскольку он не комментировал, что какое-либо из решений будет работать, мы не знаем, помогли ли другие идеи. Если это единственная идея, которая отвечает его потребностям, «безумная» будет неточным изображением. –

0

Вы можете использовать OverrideMetadata:

FrameworkElement.FocusVisualStyleProperty.OverrideMetadata(
    typeof(FrameworkElement), 
    new FrameworkPropertyMetadata(null)); 
  1. вы должны назвать это до создания какой-либо элемент, событие Application.Startup, вероятно, самое лучшее место.
  2. Это будет влиять только на элементы управления, которые используют визуальный стиль фокуса FrameworkElement и не изменят элементы управления, которые переопределяют его в коде или стилях.
  3. меня не пытается делать это с FocusVisualStyle себе
+0

К сожалению, это приводит к тому, что «PropertyMetadata уже зарегистрирован для типа« FrameworkElement » – grayscales

+2

« Вызовы OverrideMetadata должны выполняться только внутри статических конструкторов типа, который предоставляет себя в качестве параметра forType этого метода или посредством аналогичной инстанцирования ». Http : //msdn.microsoft.com/en-us/library/ms597491.aspx –

1

Я знаю, это звучит скучно, но вы, вероятно, придется делать то же самое для всех других типов элементов управления индивидуально. Однако, составление списка из них и выполнение нескольких простых операций «Найти/замещать» должно помочь вам в том, что вам нужно.

3

Согласно http://msdn.microsoft.com/en-us/library/bb613567.aspx, вы должны быть в состоянии установить глобальный стиль фокусировки, как это:

<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}"> 
    <Setter Property="Control.Template"> 
    <Setter.Value> 
     <ControlTemplate> 
     <Rectangle StrokeThickness="1" 
      Stroke="Black" 
      StrokeDashArray="1 2" 
      SnapsToDevicePixels="true"/> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Я не проверял это, но я предполагаю, что когда вы очистите контрольную таблицу, это фактически отключит прямоугольник фокуса для всего приложения (если вы включите этот стиль в app.xaml).

+6

Не работает :( – arolson101

0

Часть по умолчанию Template для класса Window - это AdornerDecorator. Если вы переопределите Window по умолчанию Template, чтобы не включать AdornerDecorator, то FocusVisualStyle на всех элементах управления не появится.

Даже если Control имеет действительный FocusVisualStyle, который устанавливает Template, он не будет появляться без AdornerDecorator.

Простым способом для этого является включение этого Style в файл App.xaml под кодом Application.Resources.

<Style TargetType="{x:Type Window}"> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> 
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Window}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> 
        <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="ResizeMode" Value="CanResizeWithGrip"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Window}"> 
         <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> 
          <Grid> 
           <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"/> 
           <ResizeGrip x:Name="WindowResizeGrip" HorizontalAlignment="Right" IsTabStop="False" Visibility="Collapsed" VerticalAlignment="Bottom"/> 
          </Grid> 
         </Border> 
         <ControlTemplate.Triggers> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="ResizeMode" Value="CanResizeWithGrip"/> 
            <Condition Property="WindowState" Value="Normal"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/> 
          </MultiTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
0

Я наткнулся на это, а также и придумал это (на самом деле не очень хорошо, но эффективно) решение:

public class FocusVisualStyleRemover 
{ 
    static FocusVisualStyleRemover() 
    { 
    EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.GotFocusEvent, new RoutedEventHandler(RemoveFocusVisualStyle), true); 
    } 

    public static void Init() 
    { 
    // intentially empty 
    } 

    private static void RemoveFocusVisualStyle(object sender, RoutedEventArgs e) 
    { 
    (sender as FrameworkElement).FocusVisualStyle = null; 
    } 
} 

В конструкторе моего MainWindow, я тогда просто позвонить FocusVisualStyleRemover.Init();

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