// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT.
// Copyright (C) Leszek Pomianowski and WPF UI Contributors.
// All Rights Reserved.
using System.Diagnostics;
using System.Text;
using System.Windows.Controls;
using System.Windows.Markup;
namespace WPFluent.Gallery.Controls;
[ContentProperty(nameof(ExampleContent))]
public class ControlExample : Control
{
/// Identifies the dependency property.
public static readonly DependencyProperty HeaderTextProperty = DependencyProperty.Register(
nameof(HeaderText),
typeof(string),
typeof(ControlExample),
new PropertyMetadata(null)
);
/// Identifies the dependency property.
public static readonly DependencyProperty ExampleContentProperty = DependencyProperty.Register(
nameof(ExampleContent),
typeof(object),
typeof(ControlExample),
new PropertyMetadata(null)
);
/// Identifies the dependency property.
public static readonly DependencyProperty XamlCodeProperty = DependencyProperty.Register(
nameof(XamlCode),
typeof(string),
typeof(ControlExample),
new PropertyMetadata(null)
);
/// Identifies the dependency property.
public static readonly DependencyProperty XamlCodeSourceProperty = DependencyProperty.Register(
nameof(XamlCodeSource),
typeof(Uri),
typeof(ControlExample),
new PropertyMetadata(
null,
static (o, args) =>
{
((ControlExample)o).OnXamlCodeSourceChanged((Uri?)args.NewValue);
}
)
);
/// Identifies the dependency property.
public static readonly DependencyProperty CsharpCodeProperty = DependencyProperty.Register(
nameof(CsharpCode),
typeof(string),
typeof(ControlExample),
new PropertyMetadata(null)
);
/// Identifies the dependency property.
public static readonly DependencyProperty CsharpCodeSourceProperty = DependencyProperty.Register(
nameof(CsharpCodeSource),
typeof(Uri),
typeof(ControlExample),
new PropertyMetadata(
null,
static (o, args) =>
{
((ControlExample)o).OnCsharpCodeSourceChanged((Uri?)args.NewValue);
}
)
);
public string? HeaderText
{
get => (string?)GetValue(HeaderTextProperty);
set => SetValue(HeaderTextProperty, value);
}
public object? ExampleContent
{
get => GetValue(ExampleContentProperty);
set => SetValue(ExampleContentProperty, value);
}
public string? XamlCode
{
get => (string?)GetValue(XamlCodeProperty);
set => SetValue(XamlCodeProperty, value);
}
public Uri? XamlCodeSource
{
get => (Uri?)GetValue(XamlCodeSourceProperty);
set => SetValue(XamlCodeSourceProperty, value);
}
public string? CsharpCode
{
get => (string?)GetValue(CsharpCodeProperty);
set => SetValue(CsharpCodeProperty, value);
}
public Uri? CsharpCodeSource
{
get => (Uri?)GetValue(CsharpCodeSourceProperty);
set => SetValue(CsharpCodeSourceProperty, value);
}
private void OnXamlCodeSourceChanged(Uri? uri)
{
SetCurrentValue(XamlCodeProperty, LoadResource(uri));
}
private void OnCsharpCodeSourceChanged(Uri? uri)
{
SetCurrentValue(CsharpCodeProperty, LoadResource(uri));
}
private static string LoadResource(Uri? uri)
{
try
{
if (uri is null || Application.GetResourceStream(uri) is not { } steamInfo)
{
return string.Empty;
}
using StreamReader streamReader = new(steamInfo.Stream, Encoding.UTF8);
return streamReader.ReadToEnd();
}
catch (Exception e)
{
Debug.WriteLine(e);
return e.ToString();
}
}
}