Browse Source

Don't allow StyledElement.Styles to be set.

It's not settable in Application and I can't see a reason it should be in `StyledElement`. Also add a `Styles` ctor that takes a parent.
pull/3597/head
Steven Kirk 6 years ago
parent
commit
097eeb646f
  1. 3
      src/Avalonia.Controls/Application.cs
  2. 24
      src/Avalonia.Styling/StyledElement.cs
  3. 6
      src/Avalonia.Styling/Styling/Styles.cs
  4. 22
      tests/Avalonia.Styling.UnitTests/StyledElementTests.cs

3
src/Avalonia.Controls/Application.cs

@ -167,8 +167,7 @@ namespace Avalonia
{ {
if (_styles == null) if (_styles == null)
{ {
_styles = new Styles(); _styles = new Styles(this);
((ISetResourceParent)_styles).SetParent(this);
_styles.ResourcesChanged += ThisResourcesChanged; _styles.ResourcesChanged += ThisResourcesChanged;
} }

24
src/Avalonia.Styling/StyledElement.cs

@ -215,29 +215,15 @@ namespace Avalonia
/// </remarks> /// </remarks>
public Styles Styles public Styles Styles
{ {
get { return _styles ?? (Styles = new Styles()); } get
set
{ {
Contract.Requires<ArgumentNullException>(value != null); if (_styles == null)
if (_styles != value)
{ {
if (_styles != null) _styles = new Styles(this);
{
(_styles as ISetResourceParent)?.SetParent(null);
_styles.ResourcesChanged -= ThisResourcesChanged;
}
_styles = value;
if (value is ISetResourceParent setParent && setParent.ResourceParent == null)
{
setParent.SetParent(this);
}
_styles.ResourcesChanged += ThisResourcesChanged; _styles.ResourcesChanged += ThisResourcesChanged;
NotifyResourcesChanged(new ResourcesChangedEventArgs());
} }
return _styles;
} }
} }

6
src/Avalonia.Styling/Styling/Styles.cs

@ -61,6 +61,12 @@ namespace Avalonia.Styling
() => { }); () => { });
} }
public Styles(IResourceNode parent)
: this()
{
_parent = parent;
}
public event NotifyCollectionChangedEventHandler CollectionChanged public event NotifyCollectionChangedEventHandler CollectionChanged
{ {
add => _styles.CollectionChanged += value; add => _styles.CollectionChanged += value;

22
tests/Avalonia.Styling.UnitTests/StyledElementTests.cs

@ -543,28 +543,6 @@ namespace Avalonia.Styling.UnitTests
Assert.Same(target, ((IResourceNode)target.Styles).ResourceParent); Assert.Same(target, ((IResourceNode)target.Styles).ResourceParent);
} }
[Fact]
public void Assigned_Styles_Parent_Is_Set()
{
var styles = new Styles();
var target = new TestControl { Styles = styles };
Assert.Same(target, ((IResourceNode)styles).ResourceParent);
}
[Fact]
public void Assigning_Styles_Raises_ResourcesChanged()
{
var styles = new Styles { Resources = { { "foo", "bar" } } };
var target = new TestControl();
var raised = 0;
target.ResourcesChanged += (s, e) => ++raised;
target.Styles = styles;
Assert.Equal(1, raised);
}
[Fact] [Fact]
public void Changing_Parent_Notifies_Styles_ParentResourcesChanged() public void Changing_Parent_Notifies_Styles_ParentResourcesChanged()
{ {

Loading…
Cancel
Save