public void Should_Bind_To_Element() { TextBlock source; ContentControl target; var root = new TestRoot { Child = new StackPanel { Children = new Controls.Controls { (source = new TextBlock { Name = "source", Text = "foo", }), (target = new ContentControl { Name = "target", }) } } }; var binding = new Binding { ElementName = "source", }; binding.Bind(target, ContentControl.ContentProperty); Assert.Same(source, target.Content); }
public void Should_Bind_To_Later_Added_Element() { TextBlock target; StackPanel stackPanel; var root = new TestRoot { Child = stackPanel = new StackPanel { Children = new Controls.Controls { (target = new TextBlock { Name = "target", }), } } }; var binding = new Binding { ElementName = "source", Path = "Text", }; binding.Bind(target, TextBlock.TextProperty); stackPanel.Children.Add(new TextBlock { Name = "source", Text = "foo", }); Assert.Equal("foo", target.Text); }
public void Track_By_Name_Should_Find_Control_Added_Later() { StackPanel panel; TextBlock relativeTo; var root = new TestRoot { Child = (panel = new StackPanel { Children = new Controls.Controls { (relativeTo = new TextBlock { Name = "start" }), } }) }; var locator = ControlLocator.Track(relativeTo, "target"); var target = new TextBlock { Name = "target" }; var result = new List<IControl>(); using (locator.Subscribe(x => result.Add(x))) { panel.Children.Add(target); } Assert.Equal(new[] { null, target }, result); Assert.Equal(0, root.NameScopeRegisteredSubscribers); Assert.Equal(0, root.NameScopeUnregisteredSubscribers); }
public void Should_Bind_To_Element_Path() { TextBlock target; var root = new TestRoot { Child = new StackPanel { Children = new Controls.Controls { new TextBlock { Name = "source", Text = "foo", }, (target = new TextBlock { Name = "target", }) } } }; var binding = new Binding { ElementName = "source", Path = "Text", }; binding.Bind(target, TextBlock.TextProperty); Assert.Equal("foo", target.Text); }
public void Source_Should_Be_Used() { var source = new Source { Foo = "foo" }; var binding = new Binding { Source = source, Path = "Foo" }; var target = new TextBlock(); target.Bind(TextBlock.TextProperty, binding); Assert.Equal(target.Text, "foo"); }
public async Task PropertyEquals_Matches_When_Property_Has_Matching_Value() { var control = new TextBlock(); var target = new Selector().PropertyEquals(TextBlock.TextProperty, "foo"); var activator = target.Match(control).ObservableResult; Assert.False(await activator.Take(1)); control.Text = "foo"; Assert.True(await activator.Take(1)); control.Text = null; Assert.False(await activator.Take(1)); }
public void Setter_Should_Apply_Binding_To_Property() { var control = new TextBlock(); var subject = new BehaviorSubject<object>("foo"); var binding = Mock.Of<IBinding>(x => x.CreateSubject(control, TextBlock.TextProperty) == subject); var style = Mock.Of<IStyle>(); var setter = new Setter(TextBlock.TextProperty, binding); setter.Apply(style, control, null); Assert.Equal("foo", control.Text); }
public void OneWayToSource_Binding_Should_Be_Set_Up() { var source = new Source { Foo = "foo" }; var target = new TextBlock { DataContext = source, Text = "bar" }; var binding = new Binding { Path = "Foo", Mode = BindingMode.OneWayToSource, }; target.Bind(TextBox.TextProperty, binding); Assert.Equal("bar", source.Foo); target.Text = "baz"; Assert.Equal("baz", source.Foo); source.Foo = "quz"; Assert.Equal("baz", target.Text); }
public void Should_Return_FallbackValue_When_Converter_Returns_UnsetValue() { var target = new TextBlock(); var source = new { A = 1, B = 2, C = 3 }; var binding = new MultiBinding { Converter = new UnsetValueConverter(), Bindings = new[] { new Binding { Path = "A" }, new Binding { Path = "B" }, new Binding { Path = "C" }, }, FallbackValue = "fallback", }; target.Bind(TextBlock.TextProperty, binding); Assert.Equal("fallback", target.Text); }
public void Grandchild_Size_Changed() { using (var context = PerspexLocator.EnterScope()) { RegisterServices(); Border border; TextBlock textBlock; var window = new Window() { SizeToContent = SizeToContent.WidthAndHeight, Content = border = new Border { HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Child = new Border { Child = textBlock = new TextBlock { Width = 400, Height = 400, Text = "Hello World!", }, } } }; window.LayoutManager.ExecuteLayoutPass(); Assert.Equal(new Size(400, 400), border.Bounds.Size); textBlock.Width = 200; window.LayoutManager.ExecuteLayoutPass(); Assert.Equal(new Size(200, 400), border.Bounds.Size); } }
public async void Track_By_Name_Should_Find_Control_Added_Earlier() { TextBlock target; TextBlock relativeTo; var root = new TestRoot { Child = new StackPanel { Children = new Controls.Controls { (target = new TextBlock { Name = "target" }), (relativeTo = new TextBlock { Name = "start" }), } } }; var locator = ControlLocator.Track(relativeTo, "target"); var result = await locator.Take(1); Assert.Same(target, result); Assert.Equal(0, root.NameScopeRegisteredSubscribers); Assert.Equal(0, root.NameScopeUnregisteredSubscribers); }
public void Grandchild_Size_Changed() { using (var context = Locator.CurrentMutable.WithResolver()) { this.RegisterServices(); Border border; TextBlock textBlock; var window = new Window() { Content = (border = new Border { HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Content = new Border { Content = (textBlock = new TextBlock { Width = 400, Height = 400, Text = "Hello World!", }), } }) }; window.LayoutManager.ExecuteLayoutPass(); Assert.Equal(new Size(400, 400), border.Bounds.Size); textBlock.Width = 200; window.LayoutManager.ExecuteLayoutPass(); Assert.Equal(new Size(200, 400), border.Bounds.Size); } }
public void Test_ScrollViewer_With_TextBlock() { using (var context = PerspexLocator.EnterScope()) { RegisterServices(); ScrollViewer scrollViewer; TextBlock textBlock; var window = new Window() { Width = 800, Height = 600, SizeToContent = SizeToContent.WidthAndHeight, Content = scrollViewer = new ScrollViewer { Width = 200, Height = 200, CanScrollHorizontally = true, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Content = textBlock = new TextBlock { Width = 400, Height = 400, Text = "Hello World!", }, } }; window.LayoutManager.ExecuteLayoutPass(); Assert.Equal(new Size(800, 600), window.Bounds.Size); Assert.Equal(new Size(200, 200), scrollViewer.Bounds.Size); Assert.Equal(new Point(300, 200), Position(scrollViewer)); Assert.Equal(new Size(400, 400), textBlock.Bounds.Size); var scrollBars = scrollViewer.GetTemplateChildren().OfType<ScrollBar>().ToList(); var presenters = scrollViewer.GetTemplateChildren().OfType<ScrollContentPresenter>().ToList(); Assert.Equal(2, scrollBars.Count); Assert.Equal(1, presenters.Count); var presenter = presenters[0]; Assert.Equal(new Size(190, 190), presenter.Bounds.Size); var horzScroll = scrollBars.Single(x => x.Orientation == Orientation.Horizontal); var vertScroll = scrollBars.Single(x => x.Orientation == Orientation.Vertical); Assert.True(horzScroll.IsVisible); Assert.True(vertScroll.IsVisible); Assert.Equal(new Size(190, 10), horzScroll.Bounds.Size); Assert.Equal(new Size(10, 190), vertScroll.Bounds.Size); Assert.Equal(new Point(0, 190), Position(horzScroll)); Assert.Equal(new Point(190, 0), Position(vertScroll)); } }
public void Track_By_Name_Should_Find_Control_When_Tree_Changed() { TextBlock target1; TextBlock target2; TextBlock relativeTo; var root1 = new TestRoot { Child = new StackPanel { Children = new Controls.Controls { (relativeTo = new TextBlock { Name = "start" }), (target1 = new TextBlock { Name = "target" }), } } }; var root2 = new TestRoot { Child = new StackPanel { Children = new Controls.Controls { (target2 = new TextBlock { Name = "target" }), } } }; var locator = ControlLocator.Track(relativeTo, "target"); var target = new TextBlock { Name = "target" }; var result = new List<IControl>(); using (locator.Subscribe(x => result.Add(x))) { ((StackPanel)root1.Child).Children.Remove(relativeTo); ((StackPanel)root2.Child).Children.Add(relativeTo); } Assert.Equal(new[] { target1, null, target2 }, result); Assert.Equal(0, root1.NameScopeRegisteredSubscribers); Assert.Equal(0, root1.NameScopeUnregisteredSubscribers); }
public void Should_Return_FallbackValue_When_Path_Not_Resolved() { var target = new TextBlock(); var source = new Source(); var binding = new Binding { Source = source, Path = "BadPath", FallbackValue = "foofallback", }; target.Bind(TextBlock.TextProperty, binding); Assert.Equal("foofallback", target.Text); }
private static void Main(string[] args) { //Log.Logger = new LoggerConfiguration() // .Filter.ByIncludingOnly(Matching.WithProperty("Area", "Layout")) // .MinimumLevel.Verbose() // .WriteTo.Trace(outputTemplate: "[{Id:X8}] [{SourceContext}] {Message}") // .CreateLogger(); // The version of ReactiveUI currently included is for WPF and so expects a WPF // dispatcher. This makes sure it's initialized. System.Windows.Threading.Dispatcher foo = System.Windows.Threading.Dispatcher.CurrentDispatcher; App application = new App { DataTemplates = new DataTemplates { new TreeDataTemplate<Node>( x => new TextBlock { Text = x.Name }, x => x.Children, x => true), }, }; TextBlock fps; var testCommand = ReactiveCommand.Create(); testCommand.Subscribe(_ => System.Diagnostics.Debug.WriteLine("Test command executed.")); Window window = new Window { Title = "Perspex Test Application", SizeToContent = SizeToContent.WidthAndHeight, Content = new Grid { ColumnDefinitions = new ColumnDefinitions { new ColumnDefinition(1, GridUnitType.Star), new ColumnDefinition(1, GridUnitType.Star), }, RowDefinitions = new RowDefinitions { new RowDefinition(GridLength.Auto), new RowDefinition(1, GridUnitType.Star), new RowDefinition(GridLength.Auto), }, Children = new Controls { new Menu { Items = new[] { new MenuItem { Header = "_File", Items = new[] { new MenuItem { Header = "_Open...", Icon = new Image { Source = new Bitmap("github_icon.png"), }, }, new MenuItem { Header = "_Save", Items = new[] { new MenuItem { Header = "Sub Item _1", }, new MenuItem { Header = "Sub Item _2", }, } }, new MenuItem { Header = "Save _As", Items = new[] { new MenuItem { Header = "Sub Item _1", }, new MenuItem { Header = "Sub Item _2", }, } }, new MenuItem { Header = "E_xit", Command = testCommand, }, } }, new MenuItem { Header = "_Edit", Items = new[] { new MenuItem { Header = "Cu_t", }, new MenuItem { Header = "_Copy", }, new MenuItem { Header = "_Paste", }, } } }, [Grid.ColumnSpanProperty] = 2, }, new TabControl { Items = new[] { ButtonsTab(), TextTab(), HtmlTab(), ImagesTab(), ListsTab(), LayoutTab(), AnimationsTab(), }, Transition = new PageSlide(TimeSpan.FromSeconds(0.25)), [Grid.RowProperty] = 1, [Grid.ColumnSpanProperty] = 2, }, (fps = new TextBlock { HorizontalAlignment = HorizontalAlignment.Left, Margin = new Thickness(2), [Grid.RowProperty] = 2, }), new TextBlock { Text = "Press F12 for Dev Tools", HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(2), [Grid.ColumnProperty] = 1, [Grid.RowProperty] = 2, }, } }, }; DevTools.Attach(window); //var renderer = ((IRenderRoot)window).Renderer; //var last = renderer.RenderCount; //DispatcherTimer.Run(() => //{ // fps.Text = "FPS: " + (renderer.RenderCount - last); // last = renderer.RenderCount; // return true; //}, TimeSpan.FromSeconds(1)); window.Show(); Application.Current.Run(window); }
public void Should_Use_DefaultValueConverter_When_No_Converter_Specified() { var target = new TextBlock(); ; var binding = new Binding { Path = "Foo", }; var result = binding.CreateSubject(target, TextBox.TextProperty); Assert.IsType<DefaultValueConverter>(((ExpressionSubject)result).Converter); }
public void Should_Pass_ConverterParameter_To_Supplied_Converter() { var target = new TextBlock(); var converter = new Mock<IValueConverter>(); var binding = new Binding { Converter = converter.Object, ConverterParameter = "foo", Path = "Bar", }; var result = binding.CreateSubject(target, TextBox.TextProperty); Assert.Same("foo", ((ExpressionSubject)result).ConverterParameter); }
public void Should_Bind_To_Later_Added_Element() { ContentControl target; StackPanel stackPanel; var root = new TestRoot { Child = stackPanel = new StackPanel { Children = new Controls.Controls { (target = new ContentControl { Name = "target", }), } } }; var binding = new Binding { ElementName = "source", }; binding.Bind(target, ContentControl.ContentProperty); var source = new TextBlock { Name = "source", Text = "foo", }; stackPanel.Children.Add(source); Assert.Same(source, target.Content); }
public void Track_By_Name_Should_Track_Removal_And_Readd() { StackPanel panel; TextBlock target; TextBlock relativeTo; var root = new TestRoot { Child = panel = new StackPanel { Children = new Controls.Controls { (target = new TextBlock { Name = "target" }), (relativeTo = new TextBlock { Name = "start" }), } } }; var locator = ControlLocator.Track(relativeTo, "target"); var result = new List<IControl>(); locator.Subscribe(x => result.Add(x)); var other = new TextBlock { Name = "target" }; panel.Children.Remove(target); panel.Children.Add(other); Assert.Equal(new[] { target, null, other }, result); }
public void Default_BindingMode_Should_Be_Used() { // Default for TextBox.Text is two-way. var source = new Source { Foo = "foo" }; var target = new TextBlock { DataContext = source }; var binding = new Binding { Path = "Foo", }; target.Bind(TextBox.TextProperty, binding); Assert.Equal("foo", target.Text); source.Foo = "bar"; Assert.Equal("bar", target.Text); target.Text = "baz"; Assert.Equal("baz", source.Foo); }