1

I have this typical The tag 'XXX' does not exist in XML namespace 'clr-namespace:XXX' problem, but I really cannot find where I did wrong.

Here is the error message:

D:\CUI\Projects\FijiLauncherTester\FijiLauncherTester\Window1.xaml(9,14): error MC3074: The tag 'BoolToValueConverter' does not exist in XML namespace 'clr-namespace:FijiLauncherTester'. Line 9 Position 14. Done building project "FijiLauncherTester.csproj" -- FAILED

The local:BoolToValueConverter in the xmal is where is messed up, but I have defined it in the C# code behind the xaml.

xaml:

<Window x:Class="FijiLauncherTester.Window1"        
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local ="clr-namespace:FijiLauncherTester"
    Title="Window1" Height="370" Width="600">

    <Window.Resources>
        <local:BoolToValueConverter x:Key="IjmFinishedStatusConverter" />       
    </Window.Resources>

    <Grid>
        <Button Content="Launch Fiji" Click="FijiLaucherButton_Click" Margin="79,0,79,31" Height="30" VerticalAlignment="Bottom">
        </Button>
        <Button x:Name="bOpenFijiDialog" Content="Open fiji"
                 Height="30" Width="90" Margin="0,50,147,0"
                 HorizontalAlignment="Right" VerticalAlignment="Top" 
                 Click="bOpenFijiDialog_Click" />

        <TextBox x:Name="tbFiji" Text="Fiji_x64 Location"
                 Height="30" Width="300" Margin="10,50"
                 HorizontalAlignment="Left" VerticalAlignment="Top" 
                 Background="Beige" />

        <Button x:Name="bOpenIjmDialog" Content="Open Ijm"
                 Height="30" Width="90" Margin="0,124,147,0"
                 HorizontalAlignment="Right" VerticalAlignment="Top" 
                 Click="bOpenIjmFileDialog_Click" />

        <TextBox x:Name="tbIjm" Text="Ijm Location"
                 Height="30" Margin="10,124,268,0" VerticalAlignment="Top" 
                 Background="Beige" />

        <Label Content="Logging?"
                 Height="30" Width="88" Margin="10,0,0,131"
                 HorizontalAlignment="Left" VerticalAlignment="Bottom" />
        <RadioButton Height="16" HorizontalAlignment="Left" Margin="160,0,0,140" Name="LogiingYes" VerticalAlignment="Bottom" Width="120" Checked="LoggingYes_Checked">Yes</RadioButton>
        <RadioButton Height="16" HorizontalAlignment="Right" Margin="0,0,166,140" Name="LogiingNo" VerticalAlignment="Bottom" Width="120" Checked="LoggingNo_Checked">No</RadioButton>
        <Label Height="30" Width="50" Content="Done?" HorizontalAlignment="Left" Margin="21,0,0,82" VerticalAlignment="Bottom" />
        <Label Margin="120,0,0,82" Height="30" VerticalAlignment="Bottom" Content="ffff" HorizontalAlignment="Left" Width="80" />   
    </Grid>
</Window>

C# behind

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using FijiLauncher;
using System.Windows.Forms;
using System.IO;

namespace FijiLauncherTester
{    

    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        private FijiLauncherControl _fl;
        private System.Windows.Forms.Timer _statusTimer;

        public string IjmFinished
        {
            get { return Convert.ToString(_fl.IjmFinished);}
            set { }
        }

        public Window1()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(Window1_Loaded);
            this.Unloaded += new RoutedEventHandler(Window1_Unloaded);


        }

        void Window1_Unloaded(object sender, RoutedEventArgs e)
        {

            //_fl = new FijiLauncherControl();
            _fl.IjmFinished -= new Action<bool>(FlFinished);

            this._statusTimer.Stop();

           // throw new NotImplementedException();
        }

        void Window1_Loaded(object sender, RoutedEventArgs e)
        {

            _fl = new FijiLauncherControl();
            _fl.IjmFinished += new Action<bool>(FlFinished);

            this._statusTimer = new System.Windows.Forms.Timer();  // read log 4 times per sec 
            this._statusTimer.Interval = 125;
            this._statusTimer.Tick += new EventHandler(_statusTimer_Tick);
            IjmFinished = "0";
            //throw new NotImplementedException();
        }


        void FlFinished(bool val)
        {
            //System.Windows.MessageBox.Show(System.Windows.Application.Current.MainWindow, "Finished");
            System.Media.SystemSounds.Beep.Play();
        }

        void _statusTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                //if (_fl.ProcessFinished)
                //{
                //    _statusTimer.Stop();

                //    System.Windows.MessageBox.Show(System.Windows.Application.Current.MainWindow, "Finished");
                //    //System.Windows.MessageBox.Show("Process is finished");

                //}
            }
            catch (Exception ex)
            {
            }
        }      

        private void FijiLaucherButton_Click(object sender, RoutedEventArgs e)
        {         
            _statusTimer.Start();           
            _fl.LaunchFiji();

        }

        private void bOpenFijiDialog_Click(object sender, RoutedEventArgs e)
        {
             // Create an instance of the open file dialog box.
            OpenFileDialog openFijiDlg = new OpenFileDialog();
            Stream myStream = null;

            // Set filter options and filter index.
            openFijiDlg.Filter = "Application (.exe)|*.exe|All Files (*.*)|*.*";
            openFijiDlg.FilterIndex = 1;

            openFijiDlg.Multiselect = false;

            if (openFijiDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                try
                {
                    if ((myStream = openFijiDlg.OpenFile()) != null)
                    {
                        using (myStream)
                        {
                            // Insert code to read the stream here.
                            _fl.FijiExeFile = openFijiDlg.FileName;
                        }
                    }
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show("Error: Could not read fiji application file from disk. Original error: " + ex.Message);
                }
            }
        }

        private void bOpenIjmFileDialog_Click(object sender, RoutedEventArgs e)
        {

            // Create an instance of the open file dialog box.
            OpenFileDialog openIjmDlg = new OpenFileDialog();
            Stream myStream = null;

            // Set filter options and filter index.
            openIjmDlg.Filter = "ImageJ Macro (.ijm)|*.ijm|All Files (*.*)|*.*";
            openIjmDlg.FilterIndex = 1;

            openIjmDlg.Multiselect = false;

            if (openIjmDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                try
                {
                    if ((myStream = openIjmDlg.OpenFile()) != null)
                    {
                        using (myStream)
                        {
                            // Insert code to read the stream here.
                            _fl.IjmFile = openIjmDlg.FileName;
                        }
                    }
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show("Error: Could not read ijm file from disk. Original error: " + ex.Message);
                }
            }

        }

        private void LoggingNo_Checked(object sender, RoutedEventArgs e)
        {
            _fl.IsLogOn = false;
        }

        private void LoggingYes_Checked(object sender, RoutedEventArgs e)
        {
            _fl.IsLogOn = true;
        }
    }


    public class BoolToValueConverter<T> : IValueConverter
    {
        public T FalseValue { get; set; }
        public T TrueValue { get; set; }

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return FalseValue;
            else
                return (bool)value ? TrueValue : FalseValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value != null ? value.Equals(TrueValue) : false;
        }
    }
}

I am wondering what is going on here? I miss something? How should I change it? Thanks.

1 Answer 1

3

The problem is your BoolToValueConverter class is a generic class. WPF is looking for a non-generic BoolToValueConverter, not BoolToValueConverter<T>.

Since this is a converter, you can remove the generics, and just use a System.Object property for the TrueValue and FalseValue, as Convert and ConvertBack work on System.Object anyways:

public class BoolToValueConverter : IValueConverter
{
    // Note that you're never setting this!
    public object FalseValue { get; set; }
    public object TrueValue { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return FalseValue;
        else
            return (bool)value ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null ? value.Equals(TrueValue) : false;
    }
}
Sign up to request clarification or add additional context in comments.

6 Comments

You mean move it outside the namespace FijiLauncherTester {}? No it does not work that way as I tried.
@NickXTsui No, I mean you need to get rid of the <T> on the class ;) XAML doesn't like generics, and doesn't understand to look for the generic class.
Can you paste the modified C# code here? I am not a C# expert, and it seems there is not going to be much change if I understand correctly? Thanks.
I replace the TrueValue and FalseValue with System.Object, it is not compiling.
@NickXTsui Added it there
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.