2009-06-28 16 views
18

Chcę globalnie dezaktywować prostokąty skupienia w mojej aplikacji WPF. W przypadku pojedynczych kontroli, które można wykonać za pomocą tej metody, można to zrobić, ale jak zastosować ją do wszystkich elementów sterujących w mojej aplikacji. Podczas składania wniosku do FrameworkElement nic się nie dzieje. Potrzebuję czegoś podobnego do "klasy x i wszystkich klas pochodnych".Dezaktywuj FocusVisualStyle globalnie

Dzięki z góry,

Stefan

Odpowiedz

0

To może nie być proste, ale można napisać funkcję, która zmienia istniejącego stylu kontrolę. Gdy to zostanie napisane, możesz napisać funkcję, która rekursywnie zmienia styl każdego elementu.

+0

Dlaczego to uzyskać -1? –

+0

Prawdopodobnie dlatego, że jest niepotrzebnie skomplikowany, obarczony trudnościami, takimi jak zapewnienie, że pokryłeś każdy możliwy przypadek krawędzi i jest dość trudny w utrzymaniu, by wymienić 2. W porównaniu z 'Stylem' i' Seterem' dla każdego typu (który, chociaż nużący, jest prosty), twoja sugestia brzmi szalenie. Nie dałem -1. –

+0

Ponieważ nie skomentował, że któreś z rozwiązań będzie działało, nie wiemy, czy pomogły inne pomysły. Jeśli jest to jedyna idea, która spełnia jego potrzeby, "obłąkany" byłby niedokładnym opisem. –

0

Można użyć OverrideMetadata:

FrameworkElement.FocusVisualStyleProperty.OverrideMetadata(
    typeof(FrameworkElement), 
    new FrameworkPropertyMetadata(null)); 
  1. trzeba nazwać zanim każdy element jest tworzony, zdarzenie Application.Startup jest prawdopodobnie najlepszym miejscem.
  2. Spowoduje to tylko formanty używające stylu wizualnego fokusu i nie zmieni elementów sterujących, które nadpisują go w kodzie lub stylach.
  3. ja nie próbuje w ten sposób z FocusVisualStyle sobie
+0

Niestety powoduje to, że "PropertyMetadata jest już zarejestrowany dla typu" FrameworkElement " – grayscales

+2

" Wywołania OverrideMetadata powinny być wykonywane tylko w statycznych konstruktorach typu, który zapewnia się jako parametr forType tej metody lub przez podobne tworzenie instancji. "Http : //msdn.microsoft.com/en-us/library/ms597491.aspx –

1

Wiem, że brzmi to uciążliwe, ale prawdopodobnie będziesz musiał zrobić to samo dla wszystkich innych rodzajów kontroli, indywidualnie. Sporządzenie ich listy i wykonanie kilku prostych operacji Znajdź/Zamień powinno dostarczyć ci tego, czego potrzebujesz.

3

Według http://msdn.microsoft.com/en-us/library/bb613567.aspx, powinieneś być w stanie ustawić globalny styl ostrości tak:

<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> 

nie testowałem to, ale myślę, że po opróżnieniu kontrolki, to faktycznie wyłączyło prostokąt skupienia dla całej aplikacji (pod warunkiem, że umieścisz ten styl w app.xaml).

+6

Nie działa :( – arolson101

0

Część domyślna Template dla klasy Window to AdornerDecorator. Jeśli zastąpisz domyślną wartość Template, aby nie zawierała ona wartości AdornerDecorator, wszystkie elementy sterujące nie będą wyświetlane na wszystkich elementach sterujących FocusVisualStyle.

Nawet jeśli Control posiada ważne FocusVisualStyle który wyznacza Template, że nie pojawią się bez AdornerDecorator.

Łatwym sposobem na osiągnięcie tego jest dołączenie tego Style do pliku App.xaml pod numerem 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

natknąłem się na to jak dobrze i wyszedł z tego (rzeczywiście nie bardzo ładne, ale skuteczne) rozwiązanie:

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; 
    } 
} 

W konstruktorze mojego MainWindow za I wtedy po prostu zadzwoń FocusVisualStyleRemover.Init();

Powiązane problemy