Fixed in Telerik.Licensing NuGet package version 1.4.10. Install this (or later) version of the package to avoid the issue.
Build errors may occur in situation where you have two projects one depending on the other, and the main project installs the Telerik.Licensing nuget package. The package triggers a set of MSBuild taks and at some point an IncrementalClean is invoked, which deletes some of the files and errors occur during the build.
The error message that can occur:
CSC : error CS0006: Metadata file 'dll/file/path/here.dll' could not be found [project directory path here]
This action is usually linked to a Button field and with it, the user of the application may revert all field values to their defaults.
A memory leak occurs when you remove the RadVirtualKeyboard from the view. The control's reference is hold by an internal static collection, which prevents it from being garbage collected.
To work this around, you can use reflection to access the NativeMethods.callbacks static collection and clear it. If you have the SynchronizeCultureWithSystem propety set to True (the default value) you should also cancel the task listens for system culture change.
private void RemoveKeyboardFromView(RadVirtualKeyboard keyboard)
{
var assembly = Assembly.LoadFrom("Telerik.Windows.Controls.Navigation.dll");
var type = assembly.GetType("Telerik.Windows.Controls.VirtualKeyboard.NativeMethods");
var field = type.GetField("callbacks", BindingFlags.Static | BindingFlags.NonPublic);
var cancelationTokenFieldInfo = typeof(RadVirtualKeyboard).GetField("systemCultureTrackingCancellationTokenSource", BindingFlags.Instance | BindingFlags.NonPublic);
var keyPressedMethodInfo = typeof(RadVirtualKeyboard).GetMethod("KeyPressed", BindingFlags.Instance | BindingFlags.NonPublic);
var keyPressedCallback = (Action<int, bool>)keyPressedMethodInfo.CreateDelegate(typeof(Action<int, bool>), keyboard);
var callbacks = (List<Action<int, bool>>)field.GetValue(null);
callbacks.Remove(keyPressedCallback);
var cancelationToken = cancelationTokenFieldInfo.GetValue(keyboard) as CancellationTokenSource;
cancelationToken.Cancel();
}
A SocketException can occur when the ImageInline source is assigned to a link pointing to a picture on a remote server (a website). For example: UriSource ="https://docs.telerik.com/devtools/wpf/knowledge-base/images/kb-chartview-categorical-and-datetime-axis-0.png"
This could happen during the fetching of the image stream. In some cases, the server may give a NetworkStream or ConnectionStream, or similar Stream implementation, which keeps an open connection between the application and the server. If the connection get severed during the stream reading, an exception is thrown.
The exception message is: "Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host."
The stacktrace is:
Exception Info: System.Net.Sockets.SocketException
at System.Net.Sockets.NetworkStream.Read(Byte[], Int32, Int32)
Inner Exception:
Exception Info: System.IO.IOException
at System.Net.ConnectStream.Read(Byte[], Int32, Int32)
at System.IO.Stream.InternalCopyTo(System.IO.Stream, Int32)
at Telerik.Windows.Documents.Layout.ExtensionMethods.ToMemoryStream(System.IO.Stream)
at Telerik.Windows.Documents.Model.ImageInline.<SetStreamFromUriSource>b__0(System.Object, StreamReadyEventArgs)
at Telerik.Windows.Documents.Utils.ResourceStreamLocator.OnStreamReady()
at System.Net.WebClient.OnOpenReadCompleted(System.Net.OpenReadCompletedEventArgs)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
at System.Windows.Application.RunDispatcher(System.Object)
at System.Windows.Application.RunInternal(System.Windows.Window)
When using French culture (fr-CH), one cannot input more than 4 digits. This is because the thousand separator is set to NarrowNonBreakableSpace.
Possible workaround, use NonBreakableSpace.
ArgumentException is thrown on mouse up, after using the DrawTool or ShapeTool in RadImageEditor or RadImageEditorUI.
The exception message is: "'∞' is not a valid value for property 'Width'."
The stacktrace is:
System.ArgumentException: '8' is not a valid value for property 'Width'. at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal) at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value) at Telerik.Windows.Media.Imaging.Commands.DrawCommand.Execute(RadBitmap source, Object context) at Telerik.Windows.Media.Imaging.History.ImageHistory.Execute(IImageCommand command, Object context) at Telerik.Windows.Controls.RadImageEditor.ExecuteCommand(IImageCommand command, Object context) at Telerik.Windows.Controls.RadImageEditor.CommitTool(Boolean executeSameToolAfterCommit) at Telerik.Windows.Media.Imaging.Tools.DrawToolBase.InvokeEndDraw(Point point) at Telerik.Windows.Media.Imaging.Tools.DrawToolBase.DrawingCanvas_MouseLeftButtonUp(Object sender, MouseButtonEventArgs e)
To work this around, you can create a custom DrawCommand based on the code from the default one and then replace it in the ShapeTool and DrawTool.
public class CustomDrawTool : DrawTool
{
public override IImageCommand GetCommand()
{
return new CustomDrawCommand();
}
}
public class CustomShapeTool : ShapeTool
{
public override IImageCommand GetCommand()
{
return new CustomDrawCommand();
}
}
public class CustomDrawCommand : IImageCommand
{
public RadBitmap Execute(RadBitmap source, object context)
{
DrawCommandContext drawCommandContext = context as DrawCommandContext;
if (drawCommandContext == null || drawCommandContext.DrawnPath == null)
{
return source;
}
Canvas canvas = new Canvas();
canvas.ClipToBounds = true;
var dpiXFactor = source.Bitmap.DpiX / 96;
var dpiYFactor = source.Bitmap.DpiY / 96;
double imageWidth = source.Width / dpiXFactor;
if (imageWidth == double.PositiveInfinity)
{
imageWidth = source.Width;
}
double imageHeight = source.Height/ dpiYFactor;
if (imageHeight == double.PositiveInfinity)
{
imageHeight = source.Height;
}
canvas.Children.Add(new System.Windows.Controls.Image()
{
Source = source.Bitmap,
Width = imageWidth,
Height = imageHeight,
});
Panel parent = drawCommandContext.DrawnPath.Parent as Panel;
if (parent != null)
{
parent.Children.Remove(drawCommandContext.DrawnPath);
drawCommandContext.DrawnPath.RenderTransform = new ScaleTransform(1 / dpiXFactor, 1 / dpiYFactor);
canvas.Children.Add(drawCommandContext.DrawnPath);
}
RenderOptions.SetBitmapScalingMode(canvas, BitmapScalingMode.NearestNeighbor);
BitmapSource bitmapSource = this.GetBitmapSource(source.Width, source.Height, canvas, source.Bitmap.DpiX, source.Bitmap.DpiY);
return new RadBitmap(bitmapSource);
}
private BitmapSource GetBitmapSource(int width, int height, Canvas canvas, double dpiX, double dpiY)
{
Size size = new Size(width, height);
canvas.Measure(size);
canvas.Arrange(new Rect(size));
RenderTargetBitmap renderBitmap = new RenderTargetBitmap(width, height, dpiX, dpiY, PixelFormats.Pbgra32);
renderBitmap.Render(canvas);
return renderBitmap;
}
}
<telerik:ImageToolItem ImageKey="Draw" telerik:LocalizationManager.ResourceKey="ImageEditor_Draw" Command="commands:ImageEditorRoutedCommands.ExecuteTool">
<telerik:ImageToolItem.CommandParameter>
<local:CustomDrawTool />
</telerik:ImageToolItem.CommandParameter>
</telerik:ImageToolItem>
The GridViewSelectColumn displays a CheckBox in its header, which selects all rows in the column. If the CheckBox is unchecked, and you click it to check the items, the items get selected/checked. However, the CheckBox doesn't get check until the second click.
This reproduces only when the RadGridView is grouped and also the groups are collapsed so that no data records are visible.
To work this around, you can replace the default CheckBox with a new one in the column's Header. Then, manually select and deselect the items. You can use the CheckBox MouseLeftButtonDown or Checked/Unchecked events. Note that it is important to wrap the CheckBox in the Header, in another control (like a Grid in the example below), in order to avoid the default RadGridView logic to kick-in.
<telerik:GridViewSelectColumn>
<telerik:GridViewSelectColumn.Header>
<Grid>
<CheckBox PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown"/>
</Grid>
</telerik:GridViewSelectColumn.Header>
</telerik:GridViewSelectColumn>
private void CheckBox_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
var checkBox = (CheckBox)sender;
if (checkBox.IsChecked.Value)
{
this.GridView.SelectedItems.Clear();
}
else
{
this.GridView.SelectAll();
}
}
When using the RadToggleSwitchButton and the CheckedContent and UncheckedContent properties are not utilized, in some themes, the on and off states cannot be correctly distinguished. For example, the track or the thumb does not indicate whether the button is checked or not.
Themes, in which this is present are the following ones:
When the RadGridView is filtered you can get all items in the data view using the Items collection property of the control. The count can be accessed with the gridView.Items.Count property.
If the RadGridView is grouped and then filtered, the Items.Count no longer returns the correct value. The count doesn't take into account the items that are in collapsed groups. Instead the count contains only the expanded group objects.
To work this around, use the following code instead of gridView.Items.Count.
int count = gridView.Items.OfType<object>().Count();
The selection with the Shift key when SelectionMode=Extended no longer works in the default Nested rendering mode of RadGridView. This reproduces only when the data view is grouped.
To work this around, set the GroupRenderMode property of RadGridView to Flat.
<telerik:RadGridView GroupRenderMode="Flat" />
ArgumentExeption when typing a specific combination with the new Japanese IME.
Steps to reproduce:
Expected should work like in the standard text box.