2013-03-18 14 views
5

Mam dwa User Control's siedzi w głównej .Zastępowanie UserControl przez właściwość

tylko jeden z nich powinien znajdować się w głównej części.

po zmianie pewnych właściwości w ViewModel, zmienić je tak:

<UserControl> 
    <ContentControl> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Setter Property="Content"> 
        <Setter.Value> 
         <local:UserControl1/> 
        </Setter.Value> 
       </Setter> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsTwo}" Value="True"> 
         <Setter Property="Content"> 
          <Setter.Value> 
           <local:UserControl2/> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</UserControl> 

Kiedy zmienić właściwość do False idzie do UserControl1 bez problemów, ale kiedy go zmienić na True istnieją problemy z wyświetlaczem i tylko wtedy, gdy poruszam się między ekranami, które pasują, jako tymczasowe rozwiązanie, stworzyłem zdarzenie za każdym razem, gdy UserControl powinien zmienić się z 1 na 2. Po uruchomieniu tego zdarzenia usuwam główny plik UserControl i tworzę go ponownie.

Ale moje pytanie brzmi, dlaczego kiedy zmieniam na jedno, nie muszę ponownie tworzyć, a kiedy zmienię na dwie, może potrzebować?

Nie daj mi żadnych pomysłów, jak rozwiązać ten problem (sam to zrobiłem), chcę wyjaśnić, dlaczego tak się dzieje, to mnie interesuje.

+0

Co masz na myśli przez "problemy z wyświetlaniem?" Czy możesz pokazać zrzut ekranu? –

+0

@DanPuzey, moja intencja: nie jest wyświetlana na ekranie tak, jak powinna być wyświetlana, wygląda na to, że utknął w poprzednim usercontorolu ("UserControl1"), nie mam już do niego dostępu (kliknie przyciski w UserCotrol nigdzie się nie wybiera, nie pierwszy, a nie drugi) –

+0

Jeśli zminimalizujesz i przywrócisz okno, które sterowanie jest wyświetlane?Zastanawiam się, czy z jakiegoś powodu zawartość się zmienia, ale okno nie jest ponownie wysyłane. –

Odpowiedz

5

Twoja WPF jest w porządku; Nie mogę odtworzyć twojego problemu; Rozpocznij nową aplikację WPF i zrzucić to do niego: czym zastąpić kontrolą użytkownika (pamiętać trzeba czasami wiążą kontrolę użytkownika w szablonie, jeśli chcesz to wiąże się czegoś konkretnego)

ViewModel.cs:

public class ViewModel : INotifyPropertyChanged 
{ 
    private bool _isTwo; 

    public bool IsTwo 
    { 
     get { return _isTwo; } 
     set 
     { 
      _isTwo = value; 
      OnPropertyChanged("IsTwo"); 
     } 
    } 

    public ICommand Switch 
    { 
     get { return new RelayCommand((_) => { IsTwo = !IsTwo; }, (_) => true); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class RelayCommand : ICommand 
{ 
    private readonly Action<object> _action; 
    private readonly Func<object, bool> _predicate; 

    public RelayCommand(Action<object> action, Func<object, bool> predicate) 
    { 
     _action = action; 
     _predicate = predicate; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return _predicate(parameter); 
    } 

    public void Execute(object parameter) 
    { 
     _action(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 
} 

MainWindow

<Window.DataContext> 
    <local:ViewModel/> 
</Window.DataContext> 

<DockPanel> 
    <Button DockPanel.Dock="Top" Command="{Binding Switch}"> Switch </Button> 
    <UserControl> 
     <ContentControl > 
      <ContentControl.Style> 
       <Style TargetType="{x:Type ContentControl}"> 
        <Setter Property="Content"> 
         <Setter.Value> 
          <local:UserControl1 DataContext="{Binding UserControl1ViewModel}"/> 
         </Setter.Value> 
        </Setter> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsTwo}" Value="True"> 
          <Setter Property="Content"> 
           <Setter.Value> 
            <local:UserControl2/> 
           </Setter.Value> 
          </Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ContentControl.Style> 
     </ContentControl> 
     </UserControl> 
</DockPanel> 

utworzyć dwa nowe (pusty) UserControls i ustawić dwa różne kolory:

Off On

Zamień jeden z nich na niesprawny kontroler użytkownika. Jeśli masz problemy z układem, najprawdopodobniej twoje formanty użytkownika próbują zmienić rozmiar lub musisz umieścić je w lepszym pojemniku. Wrzucam powyższe do DockPanel. Co generalnie całkiem dobrze rozszerza kontrolę na dostępną przestrzeń.

[Edytuj]

Więc jeśli chcesz wiedzieć, co jest tworzone, gdy klapsa to niektóre okna komunikatów pod twoją kontrolą użytkownika konstruktor

public UserControl1() 
{ 
    InitializeComponent(); 

    MessageBox.Show("Created UserControl1"); 
} 

public UserControl2() 
{ 
    InitializeComponent(); 

    MessageBox.Show("Created UserControl2"); 
} 

Dla mnie obaj są tworzone przy starcie aplikacji. np. UserControl2 nie jest jeszcze widoczny, ale został utworzony. Można by przypuszczać, że nie jest on związany, dopóki nie uruchomi się wyzwalacz Data; ale jeśli jesteś robienie jakiegoś opóźnionego kodu w twojej kontroli użytkownika, to może zepsuć WPF.

Powiązane problemy