2014-02-18 4 views
1

Я пробую очень простой пример в F # и WPF. Я хочу переопределить OnRender на Canvas. Я сделал это:WPF и пользовательский рендеринг

namespace App 

open ... 

type public MyRender = 
    class 
    inherit FrameworkElement 

    new() = { inherit FrameworkElement() } 

    override this.OnRender(dc:DrawingContext) = 
     dc.DrawRectangle(Brushes.DarkGray, null, new Rect(0.0, 0.0, 200.0, 80.0)) 
     let text = new FormattedText("Hello World!", 
            CultureInfo.CurrentUICulture, 
            FlowDirection.LeftToRight, 
            new Typeface("Tahoma"), 20.0, Brushes.White) 
     dc.DrawText(text, new Point(30.0, 25.0)) 
     dc.DrawEllipse(new SolidColorBrush(Colors.Black), 
        new Pen(Brushes.Blue, 10.0), 
        new Point(256.0, 256.0), 80.0, 30.0) 
     base.OnRender(dc) 
    end 

module Main = 
    type MainWindow = XAML<"MainWindow.xaml"> 
    let loadWindow() = 
    let window = MainWindow() 
    window.Root 

    [<;STAThread>;] 
    (new Application()).Run(loadWindow()) |> ignore 

И в файле XAML:

<Window x:Class="System.Windows.Window" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       mc:Ignorable="d" 
     xmlns:wf="clr-namespace:App" 
     Title="" Height="450" Width="500"> 
     <Canvas Height="400" Width="400"> 
     <wf:MyRender Width="300" Height="300"/> 
     </Canvas> 
</Window> 

Название приложения App.fs. XAML продолжает сообщать мне, что MyRender не найден в пространстве имен приложений. Я не могу понять, почему и что я могу сделать, чтобы исправить это. Может ли кто-нибудь просветить меня?

Заранее спасибо.

[Изменить] Я внедрил код, используя предложение Tomas Petricek. Я также переместил MyRender для наследования из FrameworkElement и поместил его в Canvas. Теперь в окне XAML в VS2013 показан элемент MyRender. Тем не менее, я все еще получаю исключение во время выполнения из-за невозможности создания неклассифицированного типа '{clr-namespace: App} MyRender'.

Проблема теперь в том, что мне нужно указать пространство имен ws: current на текущую сборку. Любая идея о том, как это сделать?

ответ

1

Предполагая, что нет ничего в файле App.fs вы в курсе, что проблема может быть, что файл (неявно) компилируется в модульимени App, а не имен имени App (модуль выглядит как статический класс, поэтому ваш MyRender будет фактически вложенным классом).

Попробуйте добавить namespace объявления в верхнюю часть:

namespace App 

type MyRender() = 
    inherit Canvas() 
    override this.OnRender(dc:DrawingContext) = 
    (...) 

type MainWindow = XAML<"MainWindow.xaml"> 

module Main = 
    let loadWindow() = 
    let window = MainWindow() 
    window.Root 

    [<STAThread>] 
    do (new Application()).Run(loadWindow()) |> ignore 

я немного упростил определение MyRender класса и добавил модуль для хранения кода точки входа. Заметьте, что я на самом деле не пробовал это, поэтому никаких гарантий!

+0

Спасибо за ваш ответ. Да, возможно, это будет именование. Я изменил код в соответствии с вашим предложением, но я все еще получаю: Исключение: Брошено: «Невозможно создать неизвестный тип» {clr-namespace: App} MyRender '. " (System.Xaml.XamlObjectWriterException) во время выполнения. Если это не именование, может ли это быть провайдер типа F # XAML? Надеюсь нет. – FabPop

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