Я пытаюсь создать реактивное приложение в F # с использованием WPF, и я столкнулся с некоторыми проблемами с доступом к элементам XAML из кода.Доступ к элементам XAML (WPF) в F #
В XAML-файл я создал сетку, содержащую 16 столбцов и строк каждый:
<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>
В F #, я пройти через сетку и программно инициализировать каждую клетку в ToggleButtons:
let initCell (x,y) (grid : Grid) =
let cell = ToggleButton()
Grid.SetColumn(cell, x)
Grid.SetRow(cell, y)
ignore (grid.Children.Add(cell))
Теперь я хочу создать наблюдаемый (ждать в рекурсивном асинхронном цикле) для нажатия любой из моих ToggleButtons. Я могу получить доступ к элементу grid внутри кода, но моя проблема в том, что я не знаю, как получить доступ к его дочерним элементам, которые я создал программно. Я думал о, возможно, рудиментарном решении, которое заключается в том, чтобы поймать событие щелчка со всей сетки и в то же время получить координаты мыши, чтобы вычислить, какая ячейка была нажата. Но это, вероятно, не очень хороший способ сделать это. Надеюсь, мой вопрос понятен, иначе, дайте мне знать.
вы можете установить «grid.Children» при необходимости и загрузить ToggleButtons – ASh
также: в цикле можно создавать RowDefinitions и ColumnDefinitions. Или просто используйте 'UniformGrid Columns =" 16 "Rows =" 16 "' вместо 'Grid' – ASh
Почему вы не используете FsXAML + FSharp.ViewModule? –