2009-09-03 13 views
6

Mam dwa różne style dla mojego okna:Jak mogę mieć WPF używać jednego stylu okna dla trybu debugowania i innego dla trybu zwolnienia?

  1. Regular - okno ma pasek tytułowy i mogą być przenoszone/zmieniany
  2. Fixed - okno ma pasek tytułowy i jest zamocowany na środku ekranu

Okno jest zbyt szerokie dla jednego z monitorów na mojej maszynie programującej, ale idealnie pasuje do maszyny docelowej/instalacyjnej. Tak więc, podczas debugowania, muszę być w stanie przesunąć okno, aby zobaczyć wszystko na nim, ale kiedy wypuszczam aplikację, potrzebuję jej do uruchomienia w trybie "pełnoekranowym" (jak aplikacja PowerPoint w trybie projektora).

Czy jest jakiś sposób ustawić właściwość Style okna w zależności od tego, czy kompiluję w trybie Debug vs. Release? Myślałem, że będę mógł użyć wiązania, ale nie jestem do końca pewien, jak go zaimplementować.

Odpowiedz

11

Utwórz klasę Style kompletacji:

namespace WpfApplication1 
{ 
    public class DebugReleaseStylePicker 
    { 
     #if DEBUG 
       internal static readonly bool debug = true; 
     #else 
     internal static readonly bool debug=false; 
     #endif 

     public Style ReleaseStyle 
     { 
      get; set; 
     } 

     public Style DebugStyle 
     { 
      get; set; 
     } 


     public Style CurrentStyle 
     { 
      get 
      { 
       return debug ? DebugStyle : ReleaseStyle; 
      } 
     } 
    } 
} 

w App.xaml dodać do swojej aplikacji.Zasoby swoją debugowania i uwalniania styl + a wystąpienie StylePicker i ustaw ReleaseStyle i DebugStyle do poprzedniego zestawu up style:

<Application.Resources> 
     <Style x:Key="WindowDebugStyle"> 
      <Setter Property="Window.Background" Value="Red"></Setter> 
     </Style> 

     <Style x:Key="WindowReleaseStyle"> 
      <Setter Property="Window.Background" Value="Blue"></Setter> 
     </Style> 

     <WpfApplication1:DebugReleaseStylePicker x:Key="stylePicker" 
      ReleaseStyle="{StaticResource WindowReleaseStyle}" 
      DebugStyle="{StaticResource WindowDebugStyle}"/> 
    </Application.Resources> 

w oknie znaczników skonfigurować WindowStyle tak:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
     Style="{Binding Source={StaticResource stylePicker}, Path=CurrentStyle}"> 
.. 
</Window> 

Możesz ponownie użyć narzędzia DebugReleaseStylePicker, aby ustawić styl dla dowolnej innej kontrolki, a nie tylko okna.

+0

Bardzo podoba mi się elastyczność tego rozwiązania. Mogłem też zobaczyć podobną technikę w innych dziedzinach. Dziękuję Ci! – devuxer

5

Może trudno to zrobić w XAML, ale w rzeczywistym kodzie można po prostu zrobić coś takiego:

#if DEBUG 
    window.Style = WindowStyles.Regular; 
#endif 

Dlaczego nie umieścić, że gdzieś, że zostanie wykonana po normalny kod XAML została wykonana?

+0

Poszedłem za tym i jest to jedno podejście, które działa. Odkryłem, że kod brzmi "WindowStyle = WindowStyle.SingleBorderWindow", ponieważ kod nie zadziałał dla mnie. – Firedragon

0

Czy możesz użyć #if DEBUG, aby ustawić właściwość na inną wartość i powiązać ją?

Może

#if DEBUG 
style = 0; 
#else 
style = 1; 
#endif 

(Należy pamiętać, że nie posiadają VS tutaj.) I użyć valueconverter.

+0

Pokonane przez pana Skeeta i jego też było przyjemniejsze! Cholerny! – serialhobbyist

3

Można by utworzyć rozszerzenie znaczników jak ten:

public class DebugStyleExtension : MarkupExtension 
{ 
    public object DebugResourceKey { get; set; } 
    public object ReleaseResourceKey { get; set; } 

    public object ProvideValue(IServiceProvider provider) 
    { 
#if DEBUG 
     return Application.Current.FindResource(DebugResourceKey) as Style; 
#else 
     return Application.Current.FindResource(ReleaseResourceKey) as Style 
#endif 
    } 
} 

byłoby użyć go tak:

<Window ... 
     xmlns:my="clr-namespace:MyNamespace" 
     Style="{my:DebugStyle DebugResourceKey=DebugStyle, ReleaseResourceKey=NormalStyle}"> 
+0

Podoba mi się to, ale nie będzie się kompilować: 'Odniesienie do obiektu jest wymagane w przypadku niestatycznego pola, metody lub właściwości" System.Windows.Application.FindResource (object) ''Kodem naruszającym prawa jest' Application.FindResource '. Czy ten plik klasy musi znajdować się w tym samym zespole, co moja aplikacja? Dzięki. – devuxer

+0

Po prostu naprawiłem kod ('Application.Current.FindResource' zamiast' Application.FindResource') –

+0

Może on znajdować się w tym samym zespole lub w innym. Jeśli znajduje się w innym zestawie, musisz podać nazwę zespołu w deklaracji xmlns. –

2

można zrobić kompilację warunkową w pliku XAML, jak również związanym kodzie. check out this article

zasadzie, robisz tak we właściwościach \ AssemblyInfo.cs:

#if BETA 
[assembly:XmlnsDefinition("BetaVersion", "Example.Technology")] 
#endif 

Dodaj swoją xmlns do pliku * .xaml:

xmlns:beta="BetaVersion" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

teraz można zrobić jak to:

<mc:Choice Requires="beta"> 
    <Label> 
    This is ALPHA software. Confidential. 
    Internal use only. Do not distribute 
    <Label> 
</mc:Choice> 

na marginesie, to prawdopodobnie nie będzie działać z silami verlight - Afik assembly:XmlnsDefinition nie jest obsługiwana

+0

jako uwaga dodatkowa, XmlnsDefinition została dodana do silverlight od wersji 4 –

+0

Niestety artykuł jest zepsuty. – Firedragon

+0

Istnieje wiele alternatywnych samouczków do połączonego artykułu. Po prostu użyj swojego ulubionego wyszukiwania w Internecie, aby wyszukać _'http: //schemas.openxmlformats.org/markup-compatibility/2006'_ i "kompilację warunkową". –

0

Wiele pomocnych odpowiedzi ... myślałem o innym pomysłem myślałem, że wyrzucają tam: konwerter wartości plus wiązania:

Oto konwerter wartość:

public class WindowToWindowStyle : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var window = (Window)value; 
      var style = (Style)window.FindResource("Window_FixedStyle"); 
#if DEBUG 
      style = (Style)window.FindResource("Window_Style"); 
#endif 
      return style; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return Binding.DoNothing; 
     } 
    } 

Oto moja deklaracja Okno:

<Window 
    ... 
    xmlns:local="clr-namespace:MyProj" 
    Style="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource ValueConverter_WindowToWindowStyle}}" 
    WindowStartupLocation="CenterScreen"> 
    <Window.Resources> 
     <local:WindowToWindowStyle 
      x:Key="ValueConverter_WindowToWindowStyle" /> 
    </Window.Resources> 
    ... 
</Window> 

co to ma:

To, co się tutaj dzieje, to przekazanie odniesienia do samego okna do konwertera wartości i zwraca odpowiedni styl.

Powiązane problemy