2010-08-31 9 views
1

Скажет, у меня есть этот XAML код:Доступ к элементу WPF (XAML) от F #?

<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 # кодом), , как я могу получить доступ к «Папану», к примеру, из моего кода?

Thanks

ответ

1

Что-то вроде этого?

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.

+0

спасибо. ваш ответ очень полезен, так как я новичок в WPF. – user248836

4

В дополнение к ответу, отправленному 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 # тип можно использовать, но синтаксис немного более удобен.

Смежные вопросы