Доступ к элементу WPF (XAML) из F #? - PullRequest
1 голос
/ 01 сентября 2010

Допустим, у меня есть этот код xaml:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Canvas>
        <Rectangle Name="papan" Fill="Red" Height="20" Width="20" />
    </Canvas>
</Window>

И у меня есть файл с именем Program.fs (код F #), как я могу получить доступ к «papan», например, из моего кода?

Спасибо

Ответы [ 2 ]

4 голосов
/ 01 сентября 2010

В дополнение к ответу, опубликованному kvb, вы можете использовать оператор динамического вызова F # (который похож на dynamic в C # 4.0), чтобы получить лучший синтаксис.Оператор позволяет определить значение таких выражений, как wnd?papan.Например, вы можете указать, что это должно выполнить поиск, используя метод FindName.Определение оператора выглядит следующим образом:

let (?) (this : Control) (prop : string) : 'T = // '
  this.FindName(prop) :?> 'T

Тогда вы можете просто написать:

let rect : Rectangle = wnd?papan 

Вам все равно нужно явно написать тип (Rectangle), чтобы вывод типа F #можно использовать, но синтаксис немного удобнее.

2 голосов
/ 01 сентября 2010

Как-то так?

open System.Windows
open System.Windows.Markup
open System.Windows.Shapes

let xaml = @"<Window xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
    xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
    <Canvas>
        <Rectangle Name='papan' Fill='Red' Height='20' Width='20' />
    </Canvas>
</Window>"

let wnd = XamlReader.Parse(xaml) :?> Window
let rect = wnd.FindName("papan") :?> Rectangle

Если XAML находится в отдельном файле, вы можете использовать XamlReader.Load вместо XamlReader.Parse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...