2016-08-01 35 views
1

Ich habe eine benutzerdefinierte Steuerung von Fenster abgeleitet:Control Auslöser funktionieren nicht in Designer (runtime ok)

class LVSDialog : Window 

mit DependencyProperty ShowCloseButton

und einem Style mit Control und Trigger:

<Style TargetType="{x:Type loc:LVSDialog}" x:Key="LVSDialogStyle"> 
    ... 
    <Setter Property="Template"> 
     ... 
     <Button x:Name="closeButton" /> 
     ... 
     <ControlTemplate.Triggers> 
      <Trigger Property="loc:LVSDialog.ShowCloseButton" Value="False"> 
       <Setter TargetName="closeButton" Property="Visibility" Value="Collapsed" /> 
      </Trigger> 
     </ControlTemplate.Triggers>    
    </Setter> 

Alles funktioniert gut in der Laufzeit, aber in Designer es nicht Sinn, wenn ich diese Eigenschaft ändern - Schaltfläche ist ständig sichtbar:

<loc:LVSDialog ... 
    ShowCloseButton="False" Style="{StaticResource LVSDialogStyle}"> 

Ich habe nach einer Lösung in Google gesucht und hier - alle Fragen sind über Laufzeit-Funktionalität, Designer-Probleme sind entweder unbeantwortet oder nicht arbeiten Vorschläge.

Ist es überhaupt möglich, volle Funktionen in der Entwurfszeit zu verwenden?

P.S. My Visual Studio 2012. Framework 4.0

+0

Gibt es einen besonderen Grund, warum Sie einen Trigger dafür verwenden und nicht einfach eine 'TemplateBinding'? – lokusking

+0

@lokusking Sie meinen '

+0

Der beste Rat, den Sie bekommen können, ist, vertrauen Sie nicht dem Designer, und vermeiden Sie es um jeden Preis. – Kcvin

Antwort

1

Wenn Sie die Basisklasse ändern, anstatt Fenster zu steuern, es wird funktionieren:

public class LVSDialog : Control 
    { 


    public bool ShowCloseButton 
    { 
     get { return (bool)GetValue(ShowCloseButtonProperty); } 
     set { SetValue(ShowCloseButtonProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ShowCloseButton. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ShowCloseButtonProperty = 
     DependencyProperty.Register("ShowCloseButton", typeof(bool), typeof(LVSDialog), new PropertyMetadata(true)); 


    } 

Von Topicstarter:

Ich habe Steuerung geändert, internes Fenster hinzugefügt, den Inhalt auf mein Steuerelement gesetzt und die Methoden Show() und ShowDialog() hinzugefügt:

private Window parentWindow; 
... 
public void Show() 
{ 
    if (parentWindow == null) 
    { 
     parentWindow = new Window {Content = this, WindowStyle = ...}; 
    } 
    parentWindow.Show(); 
} 

Alles funktioniert gut, Designer zeigt alle Eigenschaften "live".

+0

Wie sollte ich es dann verwenden? Als Inhalt für leere Fenster? Was ist mit Styling? Der Grund, warum ich benutzerdefinierte Fenster brauche - ist, dass ich es ziehbar und gestylt haben möchte. Wie kann ich es am besten erreichen? –

+0

Ok, das funktioniert. Danke. Ich habe ein internes Fenster hinzugefügt, das mein benutzerdefiniertes Steuerelement und Show enthält() und ShowDialog(), angepasster Stil und es funktioniert –

+0

Ich bin mir nicht sicher, aber ich würde kein Window als Inline - Steuerelement verwenden (untergeordnetes Element eines anderen Steuerelements) Wenn Sie ein visuelles Element inline ziehen möchten (nicht Ändern Sie seine Position in der visuellen Hierarchie) Sie können RenderTransform und LayoutTransform verwenden Wenn Sie es mehr frei ziehen möchten (wie schwebende Symbolleisten oder andockbare Fenster) Ich würde vielleicht das (Inhalts-) Steuerelement in ein Fenster ziehen, wenn Sie es ziehen und es beim Ziehen und Floaten im Fenster lassen. Aber es sind nur Gedanken - ich habe es nicht benutzt/getestet. –