var stream = new MemoryStream();
image.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
1. RadImageEditor with ZoomToCursor enable.
2.Apply ZoomOut function until render width/height less than view width/height
result => Image zoom at center of viewport, not zoom at cursor position.
The setting should be available in the settings UI, the DrawTextCommandContext and it should be respected in the DrawText command's Execute method. Scheduled for:
The feature will be available in R1 2019, scheduled for the mid of January 2019.
The RadImageEditorUI's tools (selection, shape, text, etc.) have different UI element representing their settings. Those are hosted in a settings panel. In case there are many options that cannot fit in the vertical size of the control, a scrollbar should get displayed. One example of this is the SelectionTool.
In the Office2019 and VisualStudio2019 themes, the vertical scrollbar doesn't get displayed.
To work this around, extract the ControlTemplate of SettingsPanel control. Then find the first RowDefinition of the root Grid panel and change its Height from Auto to star ( * ).
<Style TargetType="telerik:ToolSettingsPanel">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="telerik:ToolSettingsPanel">
<Grid Background="{TemplateBinding Background}">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- other xaml here -->
Using the built in OpenImageCommand functionality of telerik:RadImageEditorUI, you can detect the OpenImageCommand has been executed via the CommandExecuted event.
However there is no way to determine whether an image was loaded or not.
The Dialog Result is silently consumed by the OpenImageCommand class so if the user clicks the cancel button on the open file dialogue you have no way of knowing.
It would be good to have a means to determine the dialog result, either via a property on the command, by an additional property in the CommandExecuted event args, or even an event that is raised when an image is loaded or the dialog is cancelled.
To achieve this functionality I had to implement code like the following:
public bool IsNewImage { get; set; }
private void ImageEditor_CommandExecuting(object sender, ImageCommandExecutingEventArgs e)
{
if (e.Command is OpenImageCommand)
{
IsNewImage = false;
}
}
private void HistoryOnCurrentImageChanged(object sender, EventArgs e)
{
var history = (ImageHistory)sender;
IsNewImage = (!history.CanRedo && !history.CanUndo);
}
private void ImageEditor_CommandExecuted(object sender, ImageCommandExecutedEventArgs e)
{
if (e.Command is OpenImageCommand)
{
if (IsNewImage)
{
// Deal with new image...
}
}
}
It'd be so much easier to have the following:
private void ImageEditor_CommandExecuted(object sender, ImageCommandExecutedEventArgs e)
{
if (e.Command is OpenImageCommand)
{
if (!e.CommandCancelled)
{
// Deal with new image...
}
}
}
Thanks 👍
When Depth property is set it is expected that the undo stack would not keep more items than the depth value. However, this behaviour is not working in ImageHistory class and could lead to OutOfMemoryException when the stack gets full of ImageHistoryItem instances. Steps to reproduce: 1. Open ImageEditor and load some image. 2. Set ImageEditor.History.Depth = 1. 3. Make a few rotations. Expected: When making Undo you should be able to undo only the last rotation. Actual: You can Undo all the rotations meaning that Depth property is not respected.
Drawing with the draw tool over the image with big size (e.g. 3000 x 2500) result in loss of quality. Workaround: In the DrawCommand use the following method to create a BitmapSource which should be used for creating a RadBitmapImage. public RadBitmap Execute(RadBitmap source, object context) { ... ... ... BitmapSource bitmapSource = GetBitmapSource(source.Width, source.Height, canvas); return new RadBitmap(bitmapSource); } private BitmapSource GetBitmapSource(int width, int height, Canvas surface) { Size size = new Size(width, height); surface.Measure(size); surface.Arrange(new Rect(size)); // Create a render bitmap and push the surface to it RenderTargetBitmap renderBitmap = new RenderTargetBitmap( (int) size.Width, (int) size.Height, 96d, 96d, PixelFormats.Pbgra32); renderBitmap.Render(surface); return renderBitmap; }