none
Fehler: "Eigenschaft, die angehängt werden kann, wurde nicht gefunden." bei Verwendung einer Klassenbibliothek RRS feed

  • Frage

  • Hallo,

    ich brauche mal wieder eure Hilfe.

    Um eine CHM-Hilfe in meine Projekte zu integrieren habe ich die unten stehende HelpProvider erstellt.

    Wenn ich ihn als .cs-Datei in das Projekt einfüge, funktioniert er wie gewollt.

    Ich möchte aber weitere Projekt mit einer CHM-Hilfe ausrüsten, deshalb habe ich ihn, wie schon einige andere wiederverwertbare Code-Schnipsel,  in eine Klassenbibliothek verpackt und die dll-Datei dem Projekt als Verweis hinzugefügt. Nur bekomme ich jetzt in der xaml-Datei die 2 Fehlermeldungen:

     Die Eigenschaft "HelpProvider.HelpContext" ist im XML-Namespace "clr-namespace:LibWpfHelpProvider" nicht vorhanden. Zeile 5 Position 5.“

    Die 'HelpContext'-Eigenschaft, die angehängt werden kann, wurde in Typ 'HelpProvider' nicht gefunden.

    Code HelpProvider:

    using System.IO;
    using System.Windows;
    using System.Windows.Input;
    
    /// <summary>
    /// nach https://blogs.msdn.microsoft.com/mikehillberg/2007/07/26/a-context-sensitive-help-provider-in-wpf/
    /// </summary>
    namespace LibWpfHelpProvider
    {
        public static class HelpProvider
        {
            private static System.Diagnostics.Process chmProcess = null;
            public static readonly DependencyProperty HelpContextProperty = DependencyProperty.RegisterAttached("HelpContext", typeof(string), typeof(HelpProvider));        
            static HelpProvider()
            {
                CommandManager.RegisterClassCommandBinding(
                    typeof(FrameworkElement),
                    new CommandBinding(
                        ApplicationCommands.Help,
                        new ExecutedRoutedEventHandler(Executed),
                        new CanExecuteRoutedEventHandler(CanExecute)));
            }
            private static void CanExecute(object sender, CanExecuteRoutedEventArgs e)
            {
                FrameworkElement senderElement = sender as FrameworkElement;
                if (HelpProvider.GetHelpContext(senderElement) != null)
                    e.CanExecute = true;
            }
            private static void Executed(object sender, ExecutedRoutedEventArgs e)
            {
                const string fmtparam = "-mapid {0} \"{1}\"";
                CloseChmProcess();
                if (File.Exists(ChmFile))
                    chmProcess = System.Diagnostics.Process.Start("hh", string.Format(fmtparam, HelpProvider.GetHelpContext(sender as FrameworkElement), ChmFile));
            }
            private static void CloseChmProcess()
            {
                if (chmProcess != null)
                {
                    chmProcess.Refresh();
                    if (!chmProcess.HasExited)
                        chmProcess.Kill();
                }
            }
            public static string ChmFile { get; set; }
            public static void Close()
            {
                CloseChmProcess();
            }
            public static string GetHelpContext(DependencyObject obj)
            {
                return (string)obj.GetValue(HelpContextProperty);
            }
            public static void SetHelpContext(DependencyObject obj, string value)
            {
                obj.SetValue(HelpContextProperty, value);
            }
        }
    }
    

    MainWindow.xaml:

    <Window x:Class="WpfHelp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:h="clr-namespace:LibWpfHelpProvider"
        h:HelpProvider.HelpContext="4"
        Title="Window1" Height="300" Width="364" FontSize="16"  Closing="Window_Closing" >
        <Grid Margin="0,57,0,0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width='auto'/>
                <ColumnDefinition Width='*'/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height='auto'/>
                <RowDefinition Height='auto' />
            </Grid.RowDefinitions>
            <TextBlock Grid.Column='0' Grid.Row='0' >Name:</TextBlock>
            <TextBlock Grid.Column='0' Grid.Row='1' >Address</TextBlock>
            <TextBox Grid.Column='1' Grid.Row='0' Name='NameField'  h:HelpProvider.HelpContext="14"/>
            <TextBox Grid.Column='1' Grid.Row='1' Name='AddressField' />
        </Grid>
    </Window>
    

    MainWindow.xaml.cs:

    using LibWpfHelpProvider; using System.Windows; namespace WpfHelp { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); HelpProvider.ChmFile = @"D:\Temp\Test.chm"; }

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { HelpProvider.Close(); } } }

    Was mache ich falsch?

    Grüße

    Klaus

    Montag, 16. September 2019 12:45

Antworten

  • Hi Klaus,
    korrigiere bitte die Referenz des Alias "h". Sie zeigt auf einen Namensraum innerhalb der Assembly des Window.

    MainWindow.xaml:

    <Window x:Class="WpfHelp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:h="clr-namespace:LibWpfHelpProvider"
        h:HelpProvider.HelpContext="4"
        Title="Window1" Height="300" Width="364" FontSize="16"  Closing="Window_Closing" >
        <Grid Margin="0,57,0,0">
     

    Sie sollte bei einer anderen Assembly so aussehen:

    <Window x:Class="WpfHelp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:h="clr-namespace:LibWpfHelpProvider;assembly=LibWpfHelpProvider"
        h:HelpProvider.HelpContext="4"
        Title="Window1" Height="300" Width="364" FontSize="16"  Closing="Window_Closing" >
        <Grid Margin="0,57,0,0">


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    • Bearbeitet Peter Fleischer Dienstag, 17. September 2019 05:04
    • Als Antwort vorgeschlagen Peter Fleischer Dienstag, 17. September 2019 05:04
    • Als Antwort markiert Klaus Raabe Dienstag, 17. September 2019 07:27
    Dienstag, 17. September 2019 05:03

Alle Antworten

  • Hi Klaus,
    korrigiere bitte die Referenz des Alias "h". Sie zeigt auf einen Namensraum innerhalb der Assembly des Window.

    MainWindow.xaml:

    <Window x:Class="WpfHelp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:h="clr-namespace:LibWpfHelpProvider"
        h:HelpProvider.HelpContext="4"
        Title="Window1" Height="300" Width="364" FontSize="16"  Closing="Window_Closing" >
        <Grid Margin="0,57,0,0">
     

    Sie sollte bei einer anderen Assembly so aussehen:

    <Window x:Class="WpfHelp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:h="clr-namespace:LibWpfHelpProvider;assembly=LibWpfHelpProvider"
        h:HelpProvider.HelpContext="4"
        Title="Window1" Height="300" Width="364" FontSize="16"  Closing="Window_Closing" >
        <Grid Margin="0,57,0,0">


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    • Bearbeitet Peter Fleischer Dienstag, 17. September 2019 05:04
    • Als Antwort vorgeschlagen Peter Fleischer Dienstag, 17. September 2019 05:04
    • Als Antwort markiert Klaus Raabe Dienstag, 17. September 2019 07:27
    Dienstag, 17. September 2019 05:03
  • Danke Peter,

    wieder was von Dir gelernt.

    Viele Grüße Klaus.

    Dienstag, 17. September 2019 07:29