Gibt es bewegt wird, eine Möglichkeit, zu wissen, wann ein GridView
als Ganzes aufgenommen und hat den Fokus verloren?
Es gibt keinen direkten Weg, dies zu tun. Wir können nur eine Problemumgehung verwenden, um dieses Verhalten zu imitieren. Der Grundgedanke ist, dass seit der GotFocus
und LostFocus
beide Routed Events sind, können wir die Gridview von GotFocus
und LostFocus
in Seite Wurzel Grid GotFocus
und LostFocus
Ereignisse imitieren. Hier
ist die XAML:
<Grid Name="rootGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Margin="100,50">
<StackPanel VerticalAlignment="Center" >
<GridView Name="myGridView"></GridView>
</StackPanel>
<TextBlock Name="myTb"></TextBlock>
<GridView Name="myGridView2" ></GridView>
<TextBlock Name="output">This is the OutPut Text: </TextBlock>
<Button Name="btnFocus" >Focus Button</Button>
</StackPanel>
</Grid>
Und hier ist die Codes:
public sealed partial class MainPage : Page
{
public List<String> List;
public List<String> List2;
private object PreviousFocusItem;
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
List = new List<string> { "data1_GridView1", "data2_GridView1", "data3_GridView1" };
List2 = new List<string> { "data1_GridView2", "data2_GridView2", "data3_GridView2" };
myGridView.ItemsSource = List;
myGridView2.ItemsSource = List2;
rootGrid.GotFocus += Grid_GotFocus;
rootGrid.LostFocus += Grid_LostFocus;
base.OnNavigatedTo(e);
}
private void Grid_LostFocus(object sender, RoutedEventArgs e)
{
PreviousFocusItem = e.OriginalSource;
}
private void Grid_GotFocus(object sender, RoutedEventArgs e)
{
//get the previous focus Element and current focus Element.
var previous = PreviousFocusItem as UIElement;
var current = e.OriginalSource as UIElement;
//got focus logic
if ((!IsElementInsideGridView(myGridView, previous)) &&IsElementInsideGridView(myGridView,current))
{
//gridView got focus as a whole, put your codes here:
output.Text += "Got Focus+1 \n";
}
//lost focus logic
if ((!IsElementInsideGridView(myGridView, current)) &&(IsElementInsideGridView(myGridView,previous)))
{
//gridView lost focus as a whole, put your codes here:
output.Text += "Lost Focus+1 \n";
}
}
private bool IsElementInsideGridView(GridView gridView,UIElement element)
{
Point topLeft = gridView.TransformToVisual(this).TransformPoint(new Point());
Rect rectBounds = new Rect(topLeft.X, topLeft.Y, gridView.ActualWidth, gridView.ActualHeight);
IEnumerable<UIElement> hits = VisualTreeHelper.FindElementsInHostCoordinates(rectBounds, element);
if (hits == null || hits.Count() == 0)
{
return false;
}
else
{
return true;
}
}
}
Wie Sie jedes Mal die Wurzel Grid Fokus bekam sehen. Wenn das PreviousFocusItem liegt nicht in dem TargetGridView und CurrentFocusItem liegt in dem TargetGridView. Es bedeutet TargetGridView bekam den Fokus als Ganzes. Für LostFocus ist die Logik ähnlich.
Hier ist mein komplettes Projekt: GridViewFocusSample.
Ich verstehe Ihre Frage nicht. Wenn Sie das Register verwenden, um von einem Steuerelement zu einem Steuerelement zu wechseln, löst das erste ein LostFocus-Ereignis aus und das zweite löst ein GotFocus-Ereignis aus. Willst du nur eine Veranstaltung? Was ist dein Ziel? –
@IgorDamiani: Ich habe die Frage aktualisiert. – Bells