none
Meine ersten Versuche mit WPF Komponenten über eine dll aufrufen RRS feed

  • Frage

  • Hallo NG,

    ich habe ein kleines control geschrieben:

    namespace TestApplication.Controls
    {
        public class NoteControl : Control
        {
            public static readonly DependencyProperty TextProperty;
    
            static NoteControl()
            {
                Type ownerType = typeof(NoteControl);
                TextProperty = DependencyProperty.Register("Text", typeof(string), ownerType, new PropertyMetadata(null));
            }
            public NoteControl()
            {
                DefaultStyleKey = typeof(NoteControl);
            }
            public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } }
        }
    }

    Dann habe ich in Themes/Helpers eine NoteControl.xaml wie folgt erstellt:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
                        xmlns:helper="clr-namespace:TestApplication.Helpers">
        <Style TargetType="helper:NoteControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="helper:NoteControl">
                        <Border BorderThickness="1" BorderBrush="#FF8D8080" Background="#FFFFFFE1">
                            <Grid VerticalAlignment="Top">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition />
                                </Grid.ColumnDefinitions>
                                <Image Source="../../Resources/Exclamation.png" Stretch="None" />
                                <dxe:TextEdit Grid.Column="1" Background="Transparent" ShowBorder="False" Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}}" TextWrapping="Wrap" />
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

    und in Themes eine Generic.xaml

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:local="clr-namespace:TestApplication.Themes">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/TestApplication;component/Themes/Helpers/NoteControl.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

    Hier wurde mein Control richtig angezeigt.

    xmlns:helper="clr-namespace:TestApplication.Helpers"
    < helper:NoteControl Text="Hallo World" />

    Nun wollte ich mein Control und das Image in eine Library packen.

    Das control habe ich unter dem Namespace namespace Test.Library.Controls in der dll gespeichert und das image unter

    Test.Library.Resources

    Themes\Helpers\NoteControl.xaml habe ich wie folgt geändert:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
                        xmlns:helper="clr-namespace:Test.Library.Controls;assembly=Test.Library">
        <Style TargetType="helper:NoteControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="helper:NoteControl">
                        <Border BorderThickness="1" BorderBrush="#FF8D8080" Background="#FFFFFFE1">
                            <Grid VerticalAlignment="Top">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition />
                                </Grid.ColumnDefinitions>
                                <Image Source="/Test.Library;Component/Resources/Exclamation.png" Stretch="None" />
                                <dxe:TextEdit Grid.Column="1" Background="Transparent" ShowBorder="False" Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}}" TextWrapping="Wrap" />
                            </Grid> 
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

    Meine Generic.xaml habe ich nicht verändert.

    In meinem Window habe ich den Namespace wie folgt geändert.

    xmlns:helper="clr-namespace:Test.Library.Controls;assembly=Test.Library"

    aber mit wird mein control nicht angezeigt. Was mache ich falsch??

    Danke im voraus für jeden Hinweis und Tipp.

    Grüße Ingo


    Dienstag, 27. Oktober 2015 18:09

Antworten

  • Hallo Ingo,

    ich habe die DEVExpress Tools nicht installiert, weswegen ich das ganze auf die WPF eigenen Controls herunter gebrochen habe.

    Hier meine Anmerkungen:

    1. Die DLL sollte einen Standardstyle für dein Control erhalten. Ich habe dafür einfach die Generic.xaml in das andere Projekt geschoben.
    2. Den local XMLNS habe ich aus der Generic.xaml entfernt.
    3. Der DLL fehlt ein Verweis auf System.Xaml

    Den Fehler konnte ich zwar damit reproduzieren, aber nicht Lösen. Ich habe testweise einfach mal eine neue Custom Control DLL erstellt (über die entsprechende Vorlage) und dort deinen Code eingefügt. Dort funktionierte es. Vielleicht haben zusätzliche Nuget Pakete o.ä. etwas so an der Projektmappe Verändert das es nicht mehr wie gewollt funktioniert. Mehr helfen kann ich dir hier leider auch nicht.

    PS: Noch ein allgemeiner Tipp: Bei Custom Controls ist es meistens ratsam alles in die Generic.xaml zu packen. In einigen XAML-Projektarten werden die MergedDictionaries nicht richtig mit durchsucht. Auch verlangsamen zu viele XAMLs die Ladezeiten bei der Ausführung.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert IngoManthey Mittwoch, 28. Oktober 2015 22:23
    Mittwoch, 28. Oktober 2015 21:01
    Moderator

Alle Antworten

  • Hallo,

    wird dir das Control nur nicht angezeigt oder gibt es ein Fehler beim Erstellen? Wenn es um die Anzeige geht, meinst du die des Designers oder der ausgeführten Anwendung.

    Wenn es den Designer betrifft hilft es im Normalfall die gesamte Projektmappe zu erstellen und ggf. vorher zu bereinigen. Dadurch aktualisiert sich auch der Designer.

    Wenn es die laufende Anwendung betrifft, so kann ich hier zunächst keinen Fehler sehen. Hier empfehle ich dir die Projektmappe der DLL hoch zu laden, sodass wir es einfach nochmal selbst testen können.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 27. Oktober 2015 20:35
    Moderator
  • Hallo Tom,

    zuerst einmal 1.000 Dank für Deine Antwort.

    Im Designer und zur Laufzeit wird nichts angezeigt und es gibt auch keine Exception.

    Hier mein Testprojekt

    Grüße Ingo

    Dienstag, 27. Oktober 2015 22:45
  • Hallo Ingo,

    ich habe die DEVExpress Tools nicht installiert, weswegen ich das ganze auf die WPF eigenen Controls herunter gebrochen habe.

    Hier meine Anmerkungen:

    1. Die DLL sollte einen Standardstyle für dein Control erhalten. Ich habe dafür einfach die Generic.xaml in das andere Projekt geschoben.
    2. Den local XMLNS habe ich aus der Generic.xaml entfernt.
    3. Der DLL fehlt ein Verweis auf System.Xaml

    Den Fehler konnte ich zwar damit reproduzieren, aber nicht Lösen. Ich habe testweise einfach mal eine neue Custom Control DLL erstellt (über die entsprechende Vorlage) und dort deinen Code eingefügt. Dort funktionierte es. Vielleicht haben zusätzliche Nuget Pakete o.ä. etwas so an der Projektmappe Verändert das es nicht mehr wie gewollt funktioniert. Mehr helfen kann ich dir hier leider auch nicht.

    PS: Noch ein allgemeiner Tipp: Bei Custom Controls ist es meistens ratsam alles in die Generic.xaml zu packen. In einigen XAML-Projektarten werden die MergedDictionaries nicht richtig mit durchsucht. Auch verlangsamen zu viele XAMLs die Ladezeiten bei der Ausführung.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert IngoManthey Mittwoch, 28. Oktober 2015 22:23
    Mittwoch, 28. Oktober 2015 21:01
    Moderator
  • Hallo Tom,

    danke für die Hilfe.

    Ich bin dort über was gestolpert und weiß auch nicht wie ich das richtig machen muss.

    Ich habe die Datei NoteControl.xaml in die Dll in das Verzeichnis Themes verschoben. Dieses Verzeichnis habe ich neu angelegt. Wenn ich es nun starten will bekomme ich vom Compiler folgende Fehlermeldung:

    Alle einem IDictionary hinzugefügten Objekte müssen ein Key-Attribut oder einen anderen ihnen zugeordneten Schlüsseltyp aufweisen. Test.Library C:\Users\Ingo\Documents\Visual Studio 2015\Projects\TestApplication\Test.Library\Themes\NoteControl.xaml 4

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
                        xmlns:helper="clr-namespace:Test.Library.Controls;assembly=Test.Library">
        <Style TargetType="helper:NoteControl">Was nun??

    Was kann ich nun tun?

    Grüße  Ingo

    Mittwoch, 28. Oktober 2015 22:44