diff --git a/src/Libraries/AvalonDock/AlignedImage.cs b/src/Libraries/AvalonDock/AlignedImage.cs
index 9c322bbccf..a41303b2d9 100644
--- a/src/Libraries/AvalonDock/AlignedImage.cs
+++ b/src/Libraries/AvalonDock/AlignedImage.cs
@@ -36,6 +36,8 @@ namespace AvalonDock
{
public class AlignedImage : Decorator
{
+ /*
+ * Disabled because we use WPF 4.0 layout rounding instead.
public AlignedImage()
{
this.LayoutUpdated += new EventHandler(OnLayoutUpdated);
@@ -183,6 +185,6 @@ namespace AvalonDock
double delta = value1 - value2;
return ((delta < 1.53E-06) && (delta > -1.53E-06));
}
-
+ */
}
}
diff --git a/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs b/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs
index b0f7403433..2668e842f2 100644
--- a/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs
+++ b/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs
@@ -463,7 +463,7 @@ namespace ICSharpCode.SharpDevelop.Commands
var item = new System.Windows.Controls.MenuItem();
item.Header = ICSharpCode.Core.Presentation.MenuService.ConvertLabel(StringParser.Parse(padContent.Title));
if (!string.IsNullOrEmpty(padContent.Icon)) {
- item.Icon = PresentationResourceService.GetPixelSnappedImage(padContent.Icon);
+ item.Icon = PresentationResourceService.GetImage(padContent.Icon);
}
item.Command = new BringPadToFrontCommand(padContent);
if (!string.IsNullOrEmpty(padContent.Shortcut)) {
diff --git a/src/Main/Base/Project/Src/Gui/App.xaml b/src/Main/Base/Project/Src/Gui/App.xaml
index 76e88653e0..3016f64868 100644
--- a/src/Main/Base/Project/Src/Gui/App.xaml
+++ b/src/Main/Base/Project/Src/Gui/App.xaml
@@ -14,6 +14,7 @@
\ No newline at end of file
diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs
index 478a0d30bb..6bf0152111 100644
--- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs
+++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs
@@ -35,7 +35,7 @@ namespace ICSharpCode.SharpDevelop.Gui
this.SetValueToExtension(TitleProperty, new StringParseExtension(descriptor.Title));
placeholder = new TextBlock { Text = this.Title };
this.Content = placeholder;
- this.Icon = PresentationResourceService.GetPixelSnappedImage(descriptor.Icon);
+ this.Icon = PresentationResourceService.GetImage(descriptor.Icon);
placeholder.IsVisibleChanged += AvalonPadContent_IsVisibleChanged;
}
diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs
index 57d44b23f4..b20c7a69ee 100644
--- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs
+++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs
@@ -416,7 +416,7 @@ namespace ICSharpCode.SharpDevelop.Gui
set {
if (icon != value) {
icon = value;
- base.Icon = new PixelSnapper(new Image { Source = value });
+ base.Icon = new Image { Source = value };
}
}
}
diff --git a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml
index a90acb6d54..1fe311e3c8 100644
--- a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml
+++ b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml
@@ -6,6 +6,7 @@
WindowStartupLocation = "Manual"
Background = "{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
AllowDrop = "True"
+ UseLayoutRounding = "True"
>
diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs
index 1d1d39f7f1..d30c09d565 100644
--- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs
+++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs
@@ -376,9 +376,10 @@ namespace ICSharpCode.SharpDevelop
///
/// Creates a new image for the image source.
///
+ [ObsoleteAttribute("Use layout rounding instead")]
public static UIElement CreatePixelSnappedImage(this IImage image)
{
- return new PixelSnapper(CreateImage(image));
+ return CreateImage(image);
}
///
diff --git a/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj b/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj
index 9c68e55a3a..75520b1d4e 100644
--- a/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj
+++ b/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj
@@ -1,4 +1,5 @@
-
+
+
{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}
Debug
@@ -85,7 +86,6 @@
-
diff --git a/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs b/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs
index da2ebd7a12..daca662116 100644
--- a/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs
+++ b/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs
@@ -36,7 +36,7 @@ namespace ICSharpCode.Core.Presentation
try {
var image = PresentationResourceService.GetImage(codon.Properties["icon"]);
image.Height = 16;
- this.Icon = new PixelSnapper(image);
+ this.Icon = image;
} catch (ResourceNotFoundException) {}
}
UpdateText();
diff --git a/src/Main/ICSharpCode.Core.Presentation/PixelSnapper.cs b/src/Main/ICSharpCode.Core.Presentation/PixelSnapper.cs
deleted file mode 100644
index cb50b670f2..0000000000
--- a/src/Main/ICSharpCode.Core.Presentation/PixelSnapper.cs
+++ /dev/null
@@ -1,174 +0,0 @@
-//
-//
-//
-//
-// $Revision$
-//
-using System;
-using System.Threading;
-using System.Windows;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Threading;
-
-namespace ICSharpCode.Core.Presentation
-{
- ///
- /// A WPF control that aligns its content on pixel boundaries.
- ///
- public class PixelSnapper : UIElement
- {
- public PixelSnapper()
- {
- }
-
- public PixelSnapper(UIElement visualChild)
- : this()
- {
- this.Child = visualChild;
- }
-
- UIElement _visualChild;
-
- ///
- /// Gets/sets the visual child.
- ///
- public UIElement Child {
- get { return _visualChild; }
- set {
- RemoveVisualChild(_visualChild);
- _visualChild = value;
- AddVisualChild(_visualChild);
- InvalidateMeasure();
- }
- }
-
- ///
- /// Gets the visual child.
- ///
- protected override Visual GetVisualChild(int index)
- {
- if (index == 0 && _visualChild != null)
- return _visualChild;
- else
- throw new ArgumentOutOfRangeException("index");
- }
-
- ///
- /// Gets the number of visual children.
- ///
- protected override int VisualChildrenCount {
- get { return _visualChild != null ? 1 : 0; }
- }
-
- ///
- /// Measure the visual child.
- ///
- protected override Size MeasureCore(Size availableSize)
- {
- if (_visualChild != null) {
- _visualChild.Measure(availableSize);
- return _visualChild.DesiredSize;
- } else {
- return base.MeasureCore(availableSize);
- }
- }
-
- protected override void ArrangeCore(Rect finalRect)
- {
- base.ArrangeCore(finalRect);
- if (_visualChild != null) {
- _pixelOffset = GetPixelOffset();
- //LoggingService.Debug("Arrange, Pixel Offset=" + _pixelOffset);
- _visualChild.Arrange(new Rect(new Point(_pixelOffset.X, _pixelOffset.Y), finalRect.Size));
-
- // check again after the whole layout pass has finished, maybe we need to move
- Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new ThreadStart(CheckLayout));
- }
- }
-
- private void CheckLayout()
- {
- Point pixelOffset = GetPixelOffset();
- if (!AreClose(pixelOffset, _pixelOffset)) {
- InvalidateArrange();
- }
- }
-
- // Gets the matrix that will convert a point from "above" the
- // coordinate space of a visual into the the coordinate space
- // "below" the visual.
- static Matrix GetVisualTransform(Visual v)
- {
- if (v != null) {
- Matrix m = Matrix.Identity;
-
- Transform transform = VisualTreeHelper.GetTransform(v);
- if (transform != null) {
- m *= transform.Value;
- }
-
- Vector offset = VisualTreeHelper.GetOffset(v);
- m.Translate(offset.X, offset.Y);
-
- return m;
- }
-
- return Matrix.Identity;
- }
-
- static Point ApplyVisualTransform(Point point, Visual v, bool inverse)
- {
- if (v != null) {
- Matrix visualTransform = GetVisualTransform(v);
- if (inverse)
- visualTransform.Invert();
- point = visualTransform.Transform(point);
- }
- return point;
- }
-
- private Point GetPixelOffset()
- {
- Point pixelOffset = new Point();
-
- PresentationSource ps = PresentationSource.FromVisual(this);
- if (ps != null) {
- Visual rootVisual = ps.RootVisual;
-
- // Transform (0,0) from this element up to pixels.
- pixelOffset = this.TransformToAncestor(rootVisual).Transform(pixelOffset);
- pixelOffset = ApplyVisualTransform(pixelOffset, rootVisual, false);
- pixelOffset = ps.CompositionTarget.TransformToDevice.Transform(pixelOffset);
-
- // Round the origin to the nearest whole pixel.
- pixelOffset.X = Math.Round(pixelOffset.X);
- pixelOffset.Y = Math.Round(pixelOffset.Y);
-
- // Transform the whole-pixel back to this element.
- pixelOffset = ps.CompositionTarget.TransformFromDevice.Transform(pixelOffset);
- pixelOffset = ApplyVisualTransform(pixelOffset, rootVisual, true);
- pixelOffset = rootVisual.TransformToDescendant(this).Transform(pixelOffset);
- }
-
- return pixelOffset;
- }
-
- static bool AreClose(Point point1, Point point2)
- {
- return AreClose(point1.X, point2.X) && AreClose(point1.Y, point2.Y);
- }
-
- static bool AreClose(double value1, double value2)
- {
- if (value1 == value2)
- {
- return true;
- }
- double delta = value1 - value2;
- return ((delta < 1.53E-06) && (delta > -1.53E-06));
- }
-
- private Point _pixelOffset;
- }
-}
diff --git a/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs b/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs
index 5881acb044..88fbe4594c 100644
--- a/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs
+++ b/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs
@@ -61,9 +61,13 @@ namespace ICSharpCode.Core.Presentation
///
/// Is thrown when the GlobalResource manager can't find a requested resource.
///
- public static PixelSnapper GetPixelSnappedImage(string name)
+ [Obsolete("Use layout rounding instead")]
+ public static System.Windows.Controls.Image GetPixelSnappedImage(string name)
{
- return new PixelSnapper(GetImage(name));
+ return new System.Windows.Controls.Image {
+ Source = GetBitmapSource(name),
+ UseLayoutRounding = true
+ };
}
///
diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs
index 405a4ac65c..5e29a9ef3e 100644
--- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs
+++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs
@@ -32,7 +32,7 @@ namespace ICSharpCode.Core.Presentation
var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"]));
image.Height = 16;
image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey);
- this.Content = new PixelSnapper(image);
+ this.Content = image;
} else {
this.Content = codon.Id;
}
diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs
index b551500e4f..beed72af33 100644
--- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs
+++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs
@@ -38,7 +38,7 @@ namespace ICSharpCode.Core.Presentation
var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"]));
image.Height = 16;
image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey);
- this.Content = new PixelSnapper(image);
+ this.Content = image;
} else {
this.Content = codon.Id;
}
diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarDropDownButton.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarDropDownButton.cs
index 8eb79ec3a0..5aa31d8390 100644
--- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarDropDownButton.cs
+++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarDropDownButton.cs
@@ -31,7 +31,7 @@ namespace ICSharpCode.Core.Presentation
var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"]));
image.Height = 16;
image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey);
- this.Content = new PixelSnapper(image);
+ this.Content = image;
} else {
this.Content = codon.Id;
}
diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarSplitButton.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarSplitButton.cs
index d5bf6319fb..9360da646d 100644
--- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarSplitButton.cs
+++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarSplitButton.cs
@@ -32,7 +32,7 @@ namespace ICSharpCode.Core.Presentation
var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"]));
image.Height = 16;
image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey);
- this.Content = new PixelSnapper(image);
+ this.Content = image;
} else {
this.Content = codon.Id;
}