Ich versuche, eine reaktive Anwendung in F # mit WPF zu erstellen, und ich habe einige Probleme beim Zugriff auf XAML-Elemente aus dem Code festgestellt.Zugriff auf XAML (WPF) -Elemente in F #
In der XAML-Datei-I ein Raster mit 16 Spalten und Zeilen jeweils angelegt haben:
<StackPanel Name="cellStackPanel">
<Grid Name="cellGrid" Height="500" Width="500" Margin="10,10,10,10" Background="#CCCCCC">
<Grid.Resources>
<Style TargetType="ToggleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border x:Name="border" Background="#FFFFFFFF" Margin="1,1,1,1">
<ContentPresenter x:Name="contentPresenter"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter Property="Background" TargetName="border" Value="Black"/>
</Trigger>
<Trigger Property="Control.IsMouseOver" Value="true">
<Setter Property="Background" TargetName="border" Value="#CCCCCC"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
</Grid>
</StackPanel>
In F #, durchqueren I das Gitter durch und programmatisch jede Zelle in ToggleButtons initialisieren:
let initCell (x,y) (grid : Grid) =
let cell = ToggleButton()
Grid.SetColumn(cell, x)
Grid.SetRow(cell, y)
ignore (grid.Children.Add(cell))
Jetzt möchte ich eine Observable erstellen (um in einer rekursiven asynchronen Schleife zu warten), um auf eines meiner ToggleButtons zu klicken. Ich kann auf das Rasterelement selbst innerhalb des Codes zugreifen, aber mein Problem ist, dass ich nicht weiß, wie ich auf seine untergeordneten Elemente zugreifen kann, die ich programmatisch erstellt habe. Ich dachte an eine vielleicht rudimentäre Lösung, die das Klickereignis aus dem gesamten Raster abfängt und gleichzeitig die Mauskoordinaten ermittelt, um zu berechnen, auf welche Zelle geklickt wurde. Aber das ist wahrscheinlich kein guter Weg, dies zu tun. Ich hoffe meine Frage ist verständlich, ansonsten lass es mich wissen.
Sie können 'grid.Children' bei Bedarf wiederholen und ToggleButtons – ASh
recentive auch: es ist möglich, RowDefinitions und ColumnDefinitions in Schleife zu erstellen. Oder verwenden Sie einfach 'UniformGrid Columns =" 16 "Zeilen =" 16 "' anstelle von 'Grid' – ASh
Warum verwenden Sie nicht FsXAML + FSharp.ViewModule? –