/ / WPF Einstellen des Fokus Probleme - c #, wpf, mvvm, focus

WPF Einstellen des Fokus Probleme - c #, wpf, mvvm, focus

Basis: Ich verwende das MVVM-Muster oder eine Teilmenge davon.

In meinem Hauptfenster habe ich eine Schaltfläche, die eine Benutzerkontrolle mit einem neuen DataContext öffnet. Die Funktion sieht folgendermaßen aus:

public void SetUserControl()
{
UCDatacontext = new UCViewModel(this);
base.OnPropertyChanged("UCDatacontext");
UCViewVisibilty = Visibility.Visible;
UCDatacontext.IniFocus();
}

Und wenn ich fertig bin, schließe ich die Benutzerkontrolleund Entsorgen Sie den DataContext. Das Problem, das ich jetzt habe, ist, dass ich die Fokuseinstellung nicht richtig einstellen kann. Ich habe ein Textfeld in der Benutzersteuerung, auf das ich den Fokus setzen möchte, wenn die Ansicht sichtbar wird. Allerdings beim ersten Versuch Um den Fokus zu setzen, füllt er das Textfeld nur mit einem nicht blinkenden Einfügemarke, was mich nach einer Untersuchung zu der Annahme veranlasst, dass der TB nicht den Tastaturfokus erhält (nur logischer Fokus), jedoch selbst nach dem Festlegen des Tastaturfokus noch immer Holen Sie sich die blinkende Einfügemarke, und erst nachdem Sie in die TB geklickt haben, erhält sie den Fokus. Die Methode, die ich zum Einstellen des Fokus verwende, ist der beschriebenen Methode ähnlich Hier.
Wenn ich in der Ansicht bin, schreibe ich etwas perWird im FocusSet-Ereignis für das Textfeld ausgedruckt, wird es gesetzt, jedoch nur beim ersten Aufruf von SetUserControl (). Wenn ich SetUserControl () erneut aufrufe, macht es nichts, außer dass die Ansicht sichtbar gemacht wird, aber das Focus Set Event nicht ausgelöst wird.
Nachfolgend die Codezeilen aus dem MainWindow:

<Grid Grid.ColumnSpan="5" Grid.RowSpan="5" Visibility="{Binding Path=UCViewVisibilty }" x:Name="UCGrid"   >
<Grid.Effect>
<DropShadowEffect  />
</Grid.Effect>
<View:UCView DataContext="{Binding Path=UCDatacontext}"   />
</Grid>

Und UserControl Grid:

<Grid >
<TextBox Uid="UCTB" localExtensions:FocusExtension.IsFocused="{Binding Path=UCTBFocus}" Height="23" HorizontalAlignment="Left" Margin="113,56,0,0" Name="UCTB" VerticalAlignment="Top" Width="165" Text="{Binding Path=UCTBContent, UpdateSourceTrigger=PropertyChanged}" GotFocus="UCTB_GotFocus" />
</Grid >

Der Fokus wird im UserControlViewModel festgelegt und nach dem Rendern des UserControls festgelegt.

Antworten:

0 für die Antwort № 1

so wie es eingestellt Stellen Sie den Fokus nacheinander von oben nach unten ein.

InitializeComponent();
FocusManager.SetFocusedElement(this, TabItem); //this is Window , TabItem is UserControl in this Window
FocusManager.SetFocusedElement(TabItem, TextBox); // TabItem is UserControl and TextBox is Control in TabItem UC

Ich hoffe, das wird helfen.


0 für die Antwort № 2

Es stellte sich heraus, dass der Fokus, nachdem er mit dem Code herumgespielt hatte, nicht richtig in der Ansicht gesetzt wurde, weil die Bindung im Ansichtsmodell folgendermaßen war:

    bool _tBfocus;
public bool UCTBFocus
{
get { return _tBfocus; }
set
{
_tBfocus= value;
base.OnPropertyChanged("UCTBFocus");

}

Anstatt von:

    bool _tBfocus;
public bool UCTBFocus
{
get { return _tBfocus; }
set
{
if (_tBfocus == value)
return;
_tBfocus= value;
base.OnPropertyChanged("UCTBFocus");

}
}

Nach dem Umbau hat alles gut funktioniert: / aber wenn mir jemand erklären könnte, warum dieser Ärger, den ich hatte, dadurch verursacht wurde, wäre ich wirklich dankbar :)