私はWPFを使用してF#でリアクティブなアプリケーションを作成しようとしていますが、コードからXAML要素にアクセスする際にいくつかの問題が発生しました。F#でXAML(WPF)要素にアクセスする
私は16列と行をそれぞれ含むグリッド作成したXAMLファイルで:F#の
<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>
を、Iはグリッドを横断し、プログラム的トグルボタンにすべてのセルを初期化:
let initCell (x,y) (grid : Grid) =
let cell = ToggleButton()
Grid.SetColumn(cell, x)
Grid.SetRow(cell, y)
ignore (grid.Children.Add(cell))
今、私はToggleButtonsのいずれかをクリックするためのオブザーバブル(再帰的な非同期ループで待機する)を作成します。私はコード内のグリッド要素自体にアクセスできますが、私の問題はプログラマチックに作成した子要素にアクセスする方法がわからないことです。私は、グリッド全体からクリックイベントを捕捉すると同時に、どのセルがクリックされたかを計算するためのマウス座標を取得する、おそらく初歩的な解決策を考えていました。しかし、これはおそらくこれを行う良い方法ではありません。 私の質問が分かりやすいことを願っています。
必要に応じて 'grid.Children'をループして、ToggleButtons – ASh
も取得できます:RowDefinitionsとColumnDefinitionsをループで作成することができます。または、 'Grid 'ではなく' UniformGrid Columns = "16" Rows = "16" 'を使用してください。 – ASh
なぜFsXAML + FSharp.ViewModuleを使用しませんか? –