using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
namespace MPF.UI
{
///
/// Interaction logic for App.xaml
///
public partial class App : Application
{
#if NET35_OR_GREATER || NETCOREAPP
#region ControlTemplates
///
/// ComboBoxTemplate ControlTemplate XAML (.NET Framework 4.0 and above)
///
private const string _comboBoxTemplateDefault = @"
";
///
/// ComboBoxTemplate ControlTemplate XAML (.NET Framework 3.5)
///
private const string _comboBoxTemplateNet35 = @"
";
///
/// ComboBoxEditableTemplate ControlTemplate XAML (.NET Framework 4.0 and above)
///
private const string _comboBoxEditableTemplateDefault = @"
";
///
/// ComboBoxEditableTemplate ControlTemplate XAML (.NET Framework 3.5)
///
private const string _comboBoxEditableTemplateNet35 = @"
";
#endregion
#region Styles
///
/// ComboBoxEditableTextBox Style XAML (.NET Framework 4.0 and above)
///
private const string _comboBoxEditableTextBoxStyleDefault = @"";
///
/// ComboBoxEditableTextBox Style XAML (.NET Framework 3.5)
///
private const string _comboBoxEditableTextBoxStyleNet35 = @"";
///
/// CustomComboBoxStyle Style XAML (.NET Framework 4.0 and above)
///
private const string _customComboBoxStyleDefault = @"";
///
/// CustomComboBoxStyle Style XAML (.NET Framework 3.5)
///
private const string _customComboBoxStyleNet35 = @"";
#endregion
public App()
{
#if NET40_OR_GREATER || NETCOREAPP
InitializeComponent();
#endif
// Create control templates
CreateControlTemplate("ComboBoxTemplate");
CreateControlTemplate("ComboBoxEditableTemplate");
// Create styles
CreateStyle("ComboBoxEditableTextBox");
CreateStyle("CustomComboBoxStyle");
}
///
/// Create an XAML parser context with the required namespaces
///
private static ParserContext CreateParserContext()
{
var context = new ParserContext();
context.XmlnsDictionary[""] = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
context.XmlnsDictionary["x"] = "http://schemas.microsoft.com/winfx/2006/xaml";
#if NETFRAMEWORK
context.XmlnsDictionary["themes"] = "clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero";
#else
context.XmlnsDictionary["themes"] = "clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2";
#endif
context.XamlTypeMapper = new XamlTypeMapper([]);
return context;
}
///
/// Create a named control template and add it to the current set of resources
///
private void CreateControlTemplate(string resourceName)
{
var parserContext = CreateParserContext();
var controlTemplate = resourceName switch
{
#if NET35
"ComboBoxTemplate" => XamlReader.Parse(_comboBoxTemplateNet35, parserContext) as ControlTemplate,
"ComboBoxEditableTemplate" => XamlReader.Parse(_comboBoxEditableTemplateNet35, parserContext) as ControlTemplate,
#else
"ComboBoxTemplate" => XamlReader.Parse(_comboBoxTemplateDefault, parserContext) as ControlTemplate,
"ComboBoxEditableTemplate" => XamlReader.Parse(_comboBoxEditableTemplateDefault, parserContext) as ControlTemplate,
#endif
_ => throw new ArgumentException($"'{resourceName}' is not a recognized control template", nameof(resourceName)),
};
// Add the control template
Resources[resourceName] = controlTemplate;
}
///
/// Create a named style and add it to the current set of resources
///
private void CreateStyle(string resourceName)
{
var parserContext = CreateParserContext();
var style = resourceName switch
{
#if NET35
"ComboBoxEditableTextBox" => XamlReader.Parse(_comboBoxEditableTextBoxStyleNet35, parserContext) as Style,
"CustomComboBoxStyle" => XamlReader.Parse(_customComboBoxStyleNet35, parserContext) as Style,
#else
"ComboBoxEditableTextBox" => XamlReader.Parse(_comboBoxEditableTextBoxStyleDefault, parserContext) as Style,
"CustomComboBoxStyle" => XamlReader.Parse(_customComboBoxStyleDefault, parserContext) as Style,
#endif
_ => throw new ArgumentException($"'{resourceName}' is not a recognized style", nameof(resourceName)),
};
// Add the style
Resources[resourceName] = style;
}
#endif
}
}