Browse Source

Fixed icon support in win32 and added example icon to ControlCatalog.

pull/575/head
Jeremy Koritzinsky 10 years ago
parent
commit
b2f6a6d409
  1. BIN
      samples/ControlCatalog/Assets/test_icon.ico
  2. 5
      samples/ControlCatalog/ControlCatalog.csproj
  3. 3
      samples/ControlCatalog/MainWindow.xaml
  4. 4
      src/Avalonia.Controls/Avalonia.Controls.csproj
  5. 16
      src/Avalonia.Controls/Window.cs
  6. 1
      src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
  7. 1
      src/Markup/Avalonia.Markup.Xaml/Context/AvaloniaTypeFeatureProvider.cs
  8. 53
      src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs
  9. 6
      src/Windows/Avalonia.Win32/IconImpl.cs
  10. 7
      src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
  11. 4
      src/Windows/Avalonia.Win32/Win32Platform.cs
  12. 4
      src/Windows/Avalonia.Win32/WindowImpl.cs

BIN
samples/ControlCatalog/Assets/test_icon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

5
samples/ControlCatalog/ControlCatalog.csproj

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
@ -204,6 +204,9 @@
<Name>Avalonia.Themes.Default</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Assets\test_icon.ico" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

3
samples/ControlCatalog/MainWindow.xaml

@ -1,6 +1,7 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:pages="clr-namespace:ControlCatalog.Pages;assembly=ControlCatalog"
Title="Avalonia Control Gallery">
Title="Avalonia Control Gallery"
Icon="resm:ControlCatalog.Assets.test_icon.ico">
<TabControl Classes="sidebar">
<TabControl.Transition>
<CrossFade Duration="0.25"/>

4
src/Avalonia.Controls/Avalonia.Controls.csproj

@ -57,7 +57,6 @@
<Compile Include="IApplicationLifecycle.cs" />
<Compile Include="IScrollable.cs" />
<Compile Include="Icon.cs" />
<Compile Include="INameScope.cs" />
<Compile Include="IPseudoClasses.cs" />
<Compile Include="DropDownItem.cs" />
<Compile Include="ISetInheritanceParent.cs" />
@ -66,9 +65,6 @@
<Compile Include="IVirtualizingPanel.cs" />
<Compile Include="LayoutTransformControl.cs" />
<Compile Include="Mixins\ContentControlMixin.cs" />
<Compile Include="NameScope.cs" />
<Compile Include="NameScopeEventArgs.cs" />
<Compile Include="NameScopeExtensions.cs" />
<Compile Include="Platform\IIconImpl.cs" />
<Compile Include="Platform\IPlatformIconLoader.cs" />
<Compile Include="Platform\ITopLevelRenderer.cs" />

16
src/Avalonia.Controls/Window.cs

@ -70,6 +70,12 @@ namespace Avalonia.Controls
public static readonly StyledProperty<string> TitleProperty =
AvaloniaProperty.Register<Window, string>(nameof(Title), "Window");
/// <summary>
/// Defines the <see cref="Icon"/> property.
/// </summary>
public static readonly StyledProperty<Icon> IconProperty =
AvaloniaProperty.Register<Window, Icon>(nameof(Icon));
private readonly NameScope _nameScope = new NameScope();
private object _dialogResult;
private readonly Size _maxPlatformClientSize;
@ -83,6 +89,7 @@ namespace Avalonia.Controls
TitleProperty.Changed.AddClassHandler<Window>((s, e) => s.PlatformImpl.SetTitle((string)e.NewValue));
HasSystemDecorationsProperty.Changed.AddClassHandler<Window>(
(s, e) => s.PlatformImpl.SetSystemDecorations((bool) e.NewValue));
IconProperty.Changed.AddClassHandler<Window>((s, e) => s.PlatformImpl.SetIcon(((Icon)e.NewValue).PlatformImpl));
}
/// <summary>
@ -159,6 +166,15 @@ namespace Avalonia.Controls
set { this.PlatformImpl.WindowState = value; }
}
/// <summary>
/// Gets or sets the icon of the window.
/// </summary>
public Icon Icon
{
get { return GetValue(IconProperty); }
set { SetValue(IconProperty, value); }
}
/// <inheritdoc/>
Size ILayoutRoot.MaxClientSize => _maxPlatformClientSize;

1
src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj

@ -62,6 +62,7 @@
<Compile Include="Converters\DateTimeTypeConverter.cs" />
<Compile Include="Converters\GeometryTypeConverter.cs" />
<Compile Include="Converters\GridLengthTypeConverter.cs" />
<Compile Include="Converters\IconTypeConverter.cs" />
<Compile Include="Converters\KeyGestureConverter.cs" />
<Compile Include="Converters\MemberSelectorTypeConverter.cs" />
<Compile Include="Converters\AvaloniaListTypeConverter.cs" />

1
src/Markup/Avalonia.Markup.Xaml/Context/AvaloniaTypeFeatureProvider.cs

@ -173,6 +173,7 @@ namespace Avalonia.Markup.Xaml.Context
RegisterTypeConverter(typeof(TimeSpan), new TimeSpanTypeConverter());
RegisterTypeConverter(typeof(Uri), new UriTypeConverter());
RegisterTypeConverter(typeof(Cursor), new CursorTypeConverter());
RegisterTypeConverter(typeof(Icon), new IconTypeConverter());
}
}
}

53
src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Platform;
using OmniXaml.TypeConversion;
namespace Avalonia.Markup.Xaml.Converters
{
class IconTypeConverter : ITypeConverter
{
public bool CanConvertFrom(IValueContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public bool CanConvertTo(IValueContext context, Type destinationType)
{
return false;
}
public object ConvertFrom(IValueContext context, CultureInfo culture, object value)
{
var uri = new Uri((string)value, UriKind.RelativeOrAbsolute);
var baseUri = GetBaseUri(context);
var scheme = uri.IsAbsoluteUri ? uri.Scheme : "file";
switch (scheme)
{
case "file":
return new Icon((string)value);
default:
var assets = AvaloniaLocator.Current.GetService<IAssetLoader>();
return new Icon(assets.Open(uri, baseUri));
}
}
public object ConvertTo(IValueContext context, CultureInfo culture, object value, Type destinationType)
{
throw new NotImplementedException();
}
private Uri GetBaseUri(IValueContext context)
{
object result;
context.ParsingDictionary.TryGetValue("Uri", out result);
return result as Uri;
}
}
}

6
src/Windows/Avalonia.Win32/IconImpl.cs

@ -9,11 +9,11 @@ namespace Avalonia.Win32
{
class IconImpl : IIconImpl
{
public IconImpl(System.Drawing.Icon icon)
public IconImpl(System.Drawing.Bitmap iconBitmap)
{
Icon = icon;
IconBitmap = iconBitmap;
}
public System.Drawing.Icon Icon { get; }
public System.Drawing.Bitmap IconBitmap { get; }
}
}

7
src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs

@ -709,10 +709,7 @@ namespace Avalonia.Win32.Interop
[DllImport("user32.dll")]
public static extern bool PeekMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "RegisterClassExW")]
public static extern ushort RegisterClassEx(ref WNDCLASSEX lpwcx);
@ -847,7 +844,7 @@ namespace Avalonia.Win32.Interop
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public enum MONITOR
{

4
src/Windows/Avalonia.Win32/Win32Platform.cs

@ -191,13 +191,13 @@ namespace Avalonia.Win32
public IIconImpl LoadIcon(string fileName)
{
var icon = new System.Drawing.Icon(fileName);
var icon = new System.Drawing.Bitmap(fileName);
return new IconImpl(icon);
}
public IIconImpl LoadIcon(Stream stream)
{
var icon = new System.Drawing.Icon(stream);
var icon = new System.Drawing.Bitmap(stream);
return new IconImpl(icon);
}
}

4
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -684,9 +684,9 @@ namespace Avalonia.Win32
public void SetIcon(IIconImpl icon)
{
var impl = (IconImpl)icon;
var nativeIcon = impl.Icon;
var nativeIcon = impl.IconBitmap;
UnmanagedMethods.PostMessage(_hwnd, (int)UnmanagedMethods.WindowsMessage.WM_SETICON,
new IntPtr((int)UnmanagedMethods.Icons.ICON_BIG), nativeIcon.Handle);
new IntPtr((int)UnmanagedMethods.Icons.ICON_BIG), nativeIcon.GetHicon());
}
}
}

Loading…
Cancel
Save