Telerik Forums
UI for WPF Forum
8 answers
213 views

I have defined a RadWindow like this:

01.<telerik:RadWindow x:Class="Shell.ShellView"
02.                   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
03.                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
04.                   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
05.                   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
06.                   xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
07.                   xmlns:shell="clr-namespace:Shell"
08.                   mc:Ignorable="d"
09.                   d:DesignHeight="450" d:DesignWidth="800"
10.                   d:DataContext="{d:DesignInstance shell:ShellViewModel}"
11.                   Width="800"
12.                   Height="475"
13.                   Header="{Binding Header}"
14.                   WindowStartupLocation="{Binding StartupLocation}"
15.                   navigation:RadWindowInteropHelper.ShowInTaskbar="{Binding ShowInTaskBar}">
16.     [...]
17. 
18.</telerik:RadWindow>

 

Note the bindings on lines 13 - 15.

The corresponding view model looks like this:

01.public class ShellViewModel
02.{
03.    public bool ShowInTaskBar => true;
04. 
05.    public WindowStartupLocation StartupLocation => WindowStartupLocation.CenterScreen;
06. 
07.    public string Header => Resources.MainWindowHeader;
08. 
09.    [...]
10.}

 

As you can see, I am binding the Header, the StartupLocation, and the ShowInTaskBar properties. 

My problem is the following: while the bindings for the Header and ShowInTaskBar do work perfectly, the binding for StartupLocation doesn't. I understand why. 

Can someone tell me what I am missing here?

Thanks in advance!

 

 

Dilyan Traykov
Telerik team
 answered on 15 Oct 2020
2 answers
310 views

The strangest thing is happening with my GridView when I try to add a custom datacolumn with a checkbox in and a GridViewColumn.Header, to add anothner checkbox, that should select all checkboxes in the list, pretty standard. 

I have the code below, but when I click  the "check all"-checkbox, I do not get the Command send to my event handler, nothing happens. Now the strange part

If I, while running the application, change the markup (below) AncestorType={x:Type UserControl}}, to AncestorType={x:Type local:MyView}} it works, I get my event. Hip horray, right? Nope. If I restart the application, nothing happens again, until I change it back to the original and things are working again

 

Why, oh Telerik-Gods, why! :D

snippet below:

 

<telerik:GridViewColumn  >
    <telerik:GridViewColumn.Header>
        <CheckBox IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.IsAllChecked, Mode=TwoWay}"                                                                                   
                    Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.SelectAllRowsCommand}">
              

        </CheckBox>
    </telerik:GridViewColumn.Header>


Dilyan Traykov
Telerik team
 answered on 15 Oct 2020
1 answer
1.4K+ views

Hi,

This is a more general question, not about Telerik controls though I am using them.
(VISUAL STUDIO 2019)
I have a VSTO project (I think the question can be for Winforms projects as well).
I have a WPF project that I want to interact with from the VSTO project and back.
I managed to run (process.start with parameters) the the WPF exe from the VSTO but it's not good enough because I want to be able to communicate between the two projects.
I added the WPF project to the VSTO solution, and added a reference from the VSTO to the WPF and then create a "common project" that both projects reference to be able to pass data in common models.
I am able to run the WPF project from the VSTO (when the user clicks a button, in the UI of the VSTO, I call App.Main() in the WPF project).
The problem is that if I try to use App.Main() again (to call the WPF project again) I get an exception because I can not create a second Application in the appdomain.
Any thoughts on how I can accomplish this (my way or any other way that will let me interact between the two projects).
Thank you
Yaron

Martin Ivanov
Telerik team
 answered on 15 Oct 2020
3 answers
722 views

HI

This is longer post, sorry. First I'll explain what I'm trying to do, and then I'll tell a little about what I have tried.

The Problem

I have an object with a property that consist of a list of strings. Showing it in a RadGridView is not hard.

<RadGridView ...>
  <GridViewBoundColumnBase Header="Tags"  DataMemberBinding="{Binding CategoryTagLabels, Converter={StaticResource ListToStringConverter}}"/>
</RadGridView>

 

The ListToStringConverter basically just runs string.join(",", tags).

Now, that is mighty fine.

 

The problem is that I would like to add filtering. I would for the list of distinct values to be shown, and rows that that has any of the selected values from distinct values present in their CategoryTagLabels should be shown.

My Attempt

I tried to follow Custom Filtering Controls and the FilteringCollectionProperties_WPF from your sample SDK

<RadGridView ...>
  <GridViewBoundColumnBase Header="Tags"  DataMemberBinding="{Binding CategoryTagLabels, Converter={StaticResource ListToStringConverter}}">
    <GridViewBoundColumnBase .FilteringControl>
       <StringListFilterControl FilterMemberName="CategoryTagLabels"/>
    </GridViewBoundColumnBase .FilteringControl>
  </GridViewBoundColumnBase
</RadGridView>

 

StringListFilterControl.xaml

<UserControl x:Class="Core.Controls.ThirdParty.Telerik.StringListFilterControl"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Core.Controls.ThirdParty.Telerik"
             MinWidth="100" MinHeight="100"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <StackPanel>
        <ListView ItemsSource="{Binding Values}" x:Name="TagLabels">
 
        </ListView>
        <Button Content="Apply Filter" Click="ApplyFilter"></Button>
        <Button Content="Clear Filter" Click="ClearFilter"></Button>
    </StackPanel>
</UserControl>

 

StringListFilterControl.xaml.cs

public partial class StringListFilterControl : UserControl, IFilteringControl, INotifyPropertyChanged
    {
        private ICollection<string> _values;
        private GridViewBoundColumnBase _column;
        private CompositeFilterDescriptor _filterDescriptor;
 
        public StringListFilterControl()
        {
            InitializeComponent();
 
            this.DataContext = this;
        }
 
        public void Prepare(GridViewColumn columnToPrepare)
        {
            _column = columnToPrepare as GridViewBoundColumnBase;
            if (_column == null)
            {
                return;
            }
 
            var sender = _column.DataControl;
            var columnValues = ((RadGridView)sender).GetDistinctValues(_column, false);
            var values = new List<string>();
            foreach (var item in columnValues)
            {
                if (item == null) continue;
                values.AddRange((IEnumerable<string>)item);
            }
 
            var distinctValues = values.Distinct().ToList();
 
            Values = distinctValues;
        }
 
        public static readonly DependencyProperty IsActiveProperty = DependencyProperty.Register(
            "IsActive", typeof(bool), typeof(StringListFilterControl), new PropertyMetadata(default(bool)));
 
        public bool IsActive
        {
            get { return (bool) GetValue(IsActiveProperty); }
            set { SetValue(IsActiveProperty, value); }
        }
 
        public ICollection<string> Values
        {
            get => _values;
            set
            {
                _values = value;
                this.RaisePropertyChanged();
            }
        }
 
        public static readonly DependencyProperty FilterMemberNameProperty = DependencyProperty.Register(
            "FilterMemberName", typeof(string), typeof(StringListFilterControl), new PropertyMetadata(default(string)));
 
        public string FilterMemberName
        {
            get { return (string) GetValue(FilterMemberNameProperty); }
            set { SetValue(FilterMemberNameProperty, value); }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        private void ApplyFilter(object sender, RoutedEventArgs e)
        {
            if (_filterDescriptor == null)
            {
                _filterDescriptor = new CompositeFilterDescriptor();
                _filterDescriptor.LogicalOperator = FilterCompositionLogicalOperator.Or;
            }
 
            if (!_column.DataControl.FilterDescriptors.Contains(_filterDescriptor))
            {
                _column.DataControl.FilterDescriptors.Add(_filterDescriptor);
            }
 
            _filterDescriptor.FilterDescriptors.Clear();
            var selectedTagLabels = TagLabels.SelectedItems;
            foreach (var selectedTagLabel in selectedTagLabels)
            {
                var tagLabel = (string) selectedTagLabel;
                var filter = new TagLabelFilterDescriptor
                {
                    FilterMemberName = FilterMemberName,
                    TagLabel = tagLabel
                };
                _filterDescriptor.FilterDescriptors.Add(filter);
            }
 
            IsActive = true;
        }
 
        private void ClearFilter(object sender, RoutedEventArgs e)
        {
            _column.DataControl.FilterDescriptors.Clear();
            IsActive = false;
        }
    }
 
    public class TagLabelFilterDescriptor : IFilterDescriptor
    {
        private static readonly MethodInfo EnumerableCastMethod = typeof(Enumerable).GetMethod("Cast");
        private static MethodInfo GenericContainsMethod = GetGenericContainsMethodInfo();
 
 
        public event PropertyChangedEventHandler PropertyChanged;
        public string TagLabel { get; set; }
        public string FilterMemberName { get; set; }
        public Expression CreateFilterExpression(Expression instance)
        {
            MemberExpression collectionPropertyAccessor = Expression.Property(instance, FilterMemberName);
 
            MethodCallExpression genericCollectionPropertyAccessor = Expression.Call(null
                , EnumerableCastMethod.MakeGenericMethod(new[] { typeof(object) })
                , collectionPropertyAccessor);
 
            ConstantExpression tagLabel = Expression.Constant(TagLabel);
 
            var expression = Expression.Call(
                GenericContainsMethod,
                genericCollectionPropertyAccessor,
                tagLabel);
 
            return expression;
        }
 
        private static MethodInfo GetGenericContainsMethodInfo()
        {
            // get the Enumerable.Contains<TSource>(IEnumerable<TSource> source, TSource value) method,
            // because it is impossible to get it through Type.GetMethod().
            var methodCall = ((MethodCallExpression)
                (
                    (Expression<Func<IEnumerable<object>, bool>>)(source => source.Contains(null))
                ).Body).Method.GetGenericMethodDefinition();
            return methodCall.MakeGenericMethod(typeof(object));
        }
    }

And this actually works and I like that it is (almost) something I can just attach to a column if the property is a list of string. This is nice as I have properties of collections of strings in other tables, so it is nice when it is easy to reuse the code.

Only problem is that I now have to reimplement the filtering UI from scratch. First of I have to make it look like the other filter controls (which is hard enough) but it also mean that any styling done for the standard filtering control, will have to maintained separately for StringListFilteringControl. 

Is there any way to reuse the standard filtering control?

Dinko | Tech Support Engineer
Telerik team
 answered on 15 Oct 2020
4 answers
162 views

Here's my setup:

I have an application view leveraging a caliburn bootstrapper (should be irrelevant for the issue):

<Application x:Class="TestApp.App"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:TestApp"
             xmlns:shell="clr-namespace:TestApp.Shell"
             xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
 
                <ResourceDictionary>
                    <local:Bootstrapper x:Key="Bootstrapper" />
                </ResourceDictionary>
 
                <telerik:FluentResourceDictionary />
 
                <ResourceDictionary Source="/Telerik.Windows.Themes.Fluent;component/Themes/System.Windows.xaml" />
                <ResourceDictionary
                    Source="/Telerik.Windows.Themes.Fluent;component/Themes/Telerik.Windows.Controls.xaml" />
                <ResourceDictionary
                    Source="/Telerik.Windows.Themes.Fluent;component/Themes/telerik.windows.controls.input.xaml" />
                <ResourceDictionary
                    Source="/Telerik.Windows.Themes.Fluent;component/Themes/Telerik.Windows.Controls.Navigation.xaml" />
 
            </ResourceDictionary.MergedDictionaries>
 
            <Style TargetType="shell:ShellView" BasedOn="{StaticResource RadWindowStyle}" />
 
        </ResourceDictionary>
    </Application.Resources>
</Application>

Here's my application's shell view:

<telerik:RadWindow x:Class="TestApp.Shell.ShellView"
                   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                   xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
                   xmlns:testApp="clr-namespace:TestApp.Shell"
                   Width="800"
                   Height="475"
                   Header="Application title">
 
    <Grid>
 
    </Grid>
 
</telerik:RadWindow>

 

Note in the above code the Header="Application title". When I start that application, it shows the window shown in the attachment, i.e. a window with title "TestApp.Shell.ShellViewModel". If I, however, refactor that with the following binding

Header="{Binding Header}"

 

 

and add the Header property to my view model

using Caliburn.Micro;
 
namespace TestApp.Shell
{
    public class ShellViewModel : Conductor<IScreen>
    {
        public string Header => "Application title";
    }
}

 

then I see the correct application title.

Why can't I just hard-code my application title in my Window's xaml code? What am I doing wrong here?

Martin Ivanov
Telerik team
 answered on 15 Oct 2020
4 answers
121 views

Hello, again!

 

If pdf annotations on rotated pages have the flag /Rotate with the same angle as page angle, they will be displayed wrong.

 

I attached file with this trouble:   http://u.pc.cd/A71rtalK

And 2 screens: Correct.png and Incorrect.png

Annotation "Test2" looks incorrectly

 

Reason for this may be the using 'apprearance stream', which is trying to rotate on an already rotated page. But I am not sure.

Martin
Telerik team
 answered on 15 Oct 2020
5 answers
303 views

We are using the RadFilePathPicker and we can set the theme of the picker control but how do we set the theme of the resulting dialog when the control is opened?  The theme does not seem to carry over.

 

<telerik:RadFilePathPicker DialogType="SaveFile" FilePath="{Binding SaveLocation, Mode=TwoWay}" Margin="0" 
                                               WatermarkContent="No File Selected" VerticalAlignment="Center" Height="30" Grid.Row="4" Grid.Column="1"
                                               telerik:StyleManager.Theme="Office2016Touch"/>          

 

Dinko | Tech Support Engineer
Telerik team
 answered on 14 Oct 2020
5 answers
183 views

Hello!

 

 

If Pdf file contains page with relocated mediabox and cropbox, there are annotations on that page will be in the wrong position.

 

I attached 2 files:

Sample_Correct.pdf - http://u.pc.cd/PCVrtalK

Sample_Incorrect.pdf - http://u.pc.cd/dEI

and 2 screens:

Sample_Correct.png and Sample_Incorrect.png

 

Difference between these files, that incorrect file has moved media and crop boxes. 

Dimitar
Telerik team
 answered on 14 Oct 2020
6 answers
471 views

Hello!

 

I use PdfViewer and in some pdf files I have annotations (comments) to show them for users. But sometimes these annotations are not displayed in the Viewer. In particular we use /FreeText annotations.

I can read these annotations through Annotations property in RadFixedPage, but I can't see them in the Viewer. And if I open the same file in Adobe Reader, I can watch these annotations.

 

I noticed, that if annotation dictionary (/Annot) doesn't contain "appearance stream" in itself (/AP), it won't be displayed in the Viewer. 

For /FreeText annotation, key /AP is Optional and it annotation also contains other keys in annotation dictionary for display itself, such as /DA, /DS and /RC.

Key /DA is "Required" key and should be used like the default appearance if there is no /AP entry.

What should we do to display annotations if there aren't appearance streams for annotations? Because pdf files could be created not only Adobe software.

 

I attached 2 files:

"Before.png" on which you can see text 'Hello'

"After.png" on which you can't see that text.

Difference between these files, that in the "After.png" there is no /AP key in annotation dictionary.

You can see this on other screens: "After_behind.png" and "Before_behind.png".

 

Tanya
Telerik team
 answered on 14 Oct 2020
3 answers
328 views

Hello,

I recently updated from WPF R3 2019 to R3 WPF 2020 and I am having an issue with a custom animation attached to a RadNavigationView. It worked fine under WPF R3 2019, but is now behaving differently. Now, the menu does not always expand horizontally when the pane toggle button is pressed, and when it does, it expands instantly, ignoring the duration time. The number of times the page toggle button needs to be pressed before it expands is not consistent. The same thing happens when trying to collapse the menu, except that it does not collapse instantly. I also tried using your example here, but I get the same behavior. Is there anything I am missing here?

RadNavigationView:

<telerik:RadNavigationView Name="navigationView"
                  Style="{DynamicResource MainNavigationViewStyle}"
                  IsPaneOpen="{Binding IsPaneOpen, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=TwoWay}"
                  ItemsSource="{Binding SubPages}"
                  SelectedIndex="{Binding NavigationToken.SelectedSubPageIndex, Mode=TwoWay}"
                  Background="Transparent"
                  BorderThickness="0"
                  AutoChangeDisplayMode="False"
                  DisplayMode="Expanded"
                  PaneHeaderHeight="0"
                  PaneToggleButtonVisibility="Collapsed"
                  ItemContainerStyle="{DynamicResource MainNavigationViewItemStyle}">

 

Style:

<Style x:Key="MainNavigationViewStyle"
           TargetType="telerik:RadNavigationView"
           BasedOn="{StaticResource RadNavigationViewStyle}">
        <Setter Property="telerik:AnimationManager.AnimationSelector">
            <Setter.Value>
                <telerik:AnimationSelector>
                    <telerik:ResizeAnimation AnimationName="ResizePaneAnimation"
                                     TargetElementName="PaneGrid"
                                     Duration="0:0:0.4"
                                     ResizeMode="Horizontal">
                        <telerik:ResizeAnimation.Easing>
                            <ExponentialEase EasingMode="EaseIn"/>
                        </telerik:ResizeAnimation.Easing>
                    </telerik:ResizeAnimation>
                    <telerik:SlideAnimation AnimationName="MinimalPaneOpenAnimation"
                                    TargetElementName="PaneGrid"
                                    Duration="0:0:0.2"
                                    PixelsToAnimate="250"
                                    Orientation="Horizontal"
                                    Direction="In" />
                    <telerik:SlideAnimation AnimationName="MinimalPaneCloseAnimation"
                                    TargetElementName="PaneGrid"
                                    Duration="0:0:0.2"
                                    PixelsToAnimate="250"
                                    Orientation="Horizontal"
                                    Direction="Out"/>
                </telerik:AnimationSelector>
            </Setter.Value>
        </Setter>
    </Style>
Daniel
Top achievements
Rank 1
 answered on 13 Oct 2020
Narrow your results
Selected tags
Tags
GridView
General Discussions
Chart
RichTextBox
Docking
ScheduleView
ChartView
TreeView
Diagram
Map
ComboBox
TreeListView
Window
RibbonView and RibbonWindow
PropertyGrid
DragAndDrop
TabControl
TileView
Carousel
DataForm
PDFViewer
MaskedInput (Numeric, DateTime, Text, Currency)
AutoCompleteBox
DatePicker
Buttons
ListBox
GanttView
PivotGrid
Spreadsheet
Gauges
NumericUpDown
PanelBar
DateTimePicker
DataFilter
Menu
ContextMenu
TimeLine
Calendar
Installer and Visual Studio Extensions
ImageEditor
BusyIndicator
Expander
Slider
TileList
PersistenceFramework
DataPager
Styling
TimeBar
OutlookBar
TransitionControl
Book
FileDialogs
ToolBar
ColorPicker
TimePicker
MultiColumnComboBox
SyntaxEditor
VirtualGrid
Wizard
ExpressionEditor
NavigationView (Hamburger Menu)
WatermarkTextBox
DesktopAlert
BarCode
SpellChecker
DataServiceDataSource
EntityFrameworkDataSource
RadialMenu
ChartView3D
Data Virtualization
BreadCrumb
ProgressBar
Sparkline
LayoutControl
TabbedWindow
ToolTip
CloudUpload
ColorEditor
TreeMap and PivotMap
EntityFrameworkCoreDataSource (.Net Core)
HeatMap
Chat (Conversational UI)
VirtualizingWrapPanel
Calculator
NotifyIcon
TaskBoard
TimeSpanPicker
BulletGraph
Licensing
WebCam
CardView
DataBar
FilePathPicker
PasswordBox
Rating
SplashScreen
Accessibility
Callout
CollectionNavigator
Localization
AutoSuggestBox
Security
VirtualKeyboard
HighlightTextBlock
TouchManager
StepProgressBar
Badge
OfficeNavigationBar
ExpressionParser
CircularProgressBar
SvgImage
PipsPager
SlideView
AI Coding Assistant
+? more
Top users last month
Rob
Top achievements
Rank 3
Bronze
Bronze
Iron
Sergii
Top achievements
Rank 1
Iron
Iron
Dedalus
Top achievements
Rank 1
Iron
Iron
Lan
Top achievements
Rank 1
Iron
Doug
Top achievements
Rank 1
Want to show your ninja superpower to fellow developers?
Top users last month
Rob
Top achievements
Rank 3
Bronze
Bronze
Iron
Sergii
Top achievements
Rank 1
Iron
Iron
Dedalus
Top achievements
Rank 1
Iron
Iron
Lan
Top achievements
Rank 1
Iron
Doug
Top achievements
Rank 1
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?