Şimdi kısaca özetlemem gerekirse olay şundan ibaret. Altta bulunan bir xaml yapım var.
Şimdi ben istiyorum ki herhangi bir butonuna tıkladığımda, "NavbarStackPanel" içerisindeki tüm StackPanelleri arasın, bu aramış olduğu StackPanellerin içerisinde tekrar Gridleri arasın. Eğer grid ismi bastığım butonun ismi ve "IsActive" eşit ise (Örneğin Buton ismi Apperance, Grid ismi ApperanceIsActive) o gridin görünürlüğünü visible, eğer değil ise collapsed yapsın.
Kodum aynen şöyle:
Gelen hata ise şu:
Fakat ben "foreach (Grid grid in stackPanel.Children)" kodu ile sadece stackPanel.Children içerisinde gridleri aratmış olmuyor muyum? Neden buttonları da sistem "grid" değişkene atıyor? Nerede hata yapıyorum, yardımcı olabilir misiniz?
Edit: Sanırsam bu foreach döngüsünde değişkenin türüne karar veremiyormuşuz. Yanlış biliyormuşum. Grid grid yazdığımda, ben Gridleri aratmış olmuyorum galiba UIElementler'i aratıp onların Grid olmasını sağlıyorum. Bu da sanırsam bulduğu buttonları Grid'e çevirmeye çalıştığından o yüzden hata alıyorum. Fakat ben nasıl stackpanel içerisinde sadece gridleri aratabilirim? typeof(Grid) ve GetType(Grid) tarzı kodlarda denememe rağmen çözüme ulaşamadım.
Çözüm:
XML:
<stackpanel x:Name="NavbarStackPanel">
<stackpanel x:Name="AppearanceStackPanel">
<button x:Name="Appearance"/>
<grid x:Name="AppearanceIsActive"/>
</stackpanel>
<stackpanel x:Name="LanguageStackPanel">
<button x:Name="Language"/>
<grid x:Name="LanguageIsActive"/>
</stackpanel>
</stackpanel>
Şimdi ben istiyorum ki herhangi bir butonuna tıkladığımda, "NavbarStackPanel" içerisindeki tüm StackPanelleri arasın, bu aramış olduğu StackPanellerin içerisinde tekrar Gridleri arasın. Eğer grid ismi bastığım butonun ismi ve "IsActive" eşit ise (Örneğin Buton ismi Apperance, Grid ismi ApperanceIsActive) o gridin görünürlüğünü visible, eğer değil ise collapsed yapsın.
Kodum aynen şöyle:
C#:
private void NavbarButton_Click(object sender, RoutedEventArgs e)
{
string parentName = ((Button)sender).Name;
foreach (StackPanel stackPanel in NavbarStackPanel.Children)
{
foreach (Grid grid in stackPanel.Children)
{
if (grid.Name == parentName + "IsActive")
{
grid.Visibility = Visibility.Visible;
}
else
{
grid.Visibility = Visibility.Collapsed;
}
}
}
}
Gelen hata ise şu:
Kod:
System.InvalidCastException: 'Unable to cast object of type 'Windows.UI.Xaml.Controls.Button' to type 'Windows.UI.Xaml.Controls.Grid'.'
Fakat ben "foreach (Grid grid in stackPanel.Children)" kodu ile sadece stackPanel.Children içerisinde gridleri aratmış olmuyor muyum? Neden buttonları da sistem "grid" değişkene atıyor? Nerede hata yapıyorum, yardımcı olabilir misiniz?
Edit: Sanırsam bu foreach döngüsünde değişkenin türüne karar veremiyormuşuz. Yanlış biliyormuşum. Grid grid yazdığımda, ben Gridleri aratmış olmuyorum galiba UIElementler'i aratıp onların Grid olmasını sağlıyorum. Bu da sanırsam bulduğu buttonları Grid'e çevirmeye çalıştığından o yüzden hata alıyorum. Fakat ben nasıl stackpanel içerisinde sadece gridleri aratabilirim? typeof(Grid) ve GetType(Grid) tarzı kodlarda denememe rağmen çözüme ulaşamadım.
Çözüm:
C#:
foreach (UIElement element in stackPanel.Children)
{
if (element is Grid grid)
{
if (grid.Name == parentName + "IsActive")
{
grid.Visibility = Visibility.Visible;
}
else
{
grid.Visibility = Visibility.Collapsed;
}
}
}
Son düzenleyen: Moderatör: