c# - WPF ToggleButton display state when disabled -
i have toggle buttons on wpf form use display boolean value.
some of button supposed "read only", setted them isenabled = false.
however, should display ischecked state nonetheless apear unchecked
as can see, disabled seem unchecked, should checked.
i'm creating toggle buttons code problem there "static" toggle buttons
togglebutton tb = new togglebutton(); tb.name = "btnregisterr" + register + "p" + pos; tb.content = tuple.item1"; tb.ischecked = rnd.nextdouble() >= 0.5; tb.isenabled = tuple.item2; tb.verticalalignment = verticalalignment.top; tb.horizontalalignment = horizontalalignment.left; tb.height = 25; tb.width = 87; tb.margin = new thickness(xpos, ypos, 0, 0); registergrid.children.add(tb);
edit : don't think duplicate of linked question, i'm not looking disable interaction on button disabled keep displaying status. linked question answer functional part wheras i'm asking styling part.
for exemple, in winforms, there apperance button checkbox, allow 2 separate display states (by default gray button when unselected/unchecked , light blue 1 when selected/checked).
on top of that, control enabled/disabled, which, in disable state, whitend whole control still display diferrently when enabled or disabled.
edit 2 : futher clarification, here using in old winform app checkboxes appearance setting set "button"
you can visualy separate ones enabled or disabled while still able see state of input (checked or not). i'm trying replicate display behavior in wpf, without succes moment "checked|disabled" , "unchecked|disabled" same wpf toggle button.
edit 3 :
i ended using multitrigger in style make work. don't know if it's best solution, but, @ least, give same results in winform
<style x:key="focusvisual"> <setter property="control.template"> <setter.value> <controltemplate> <rectangle margin="2" snapstodevicepixels="true" stroke="{dynamicresource {x:static systemcolors.controltextbrushkey}}" strokethickness="1" strokedasharray="1 2"/> </controltemplate> </setter.value> </setter> </style> <solidcolorbrush x:key="button.static.background" color="#ffdddddd"/> <solidcolorbrush x:key="button.static.border" color="#ff707070"/> <solidcolorbrush x:key="button.mouseover.background" color="#ffbee6fd"/> <solidcolorbrush x:key="button.mouseover.border" color="#ff3c7fb1"/> <solidcolorbrush x:key="button.pressed.background" color="#ffc4e5f6"/> <solidcolorbrush x:key="button.pressed.border" color="#ff2c628b"/> <solidcolorbrush x:key="button.disabled.background" color="#fff4f4f4"/> <solidcolorbrush x:key="button.disabled.border" color="#ffadb2b5"/> <solidcolorbrush x:key="button.disabled.foreground" color="#ff838383"/> <style x:key="disabledandcheckedbutton" targettype="{x:type togglebutton}"> <setter property="focusvisualstyle" value="{staticresource focusvisual}"/> <setter property="background" value="{staticresource button.static.background}"/> <setter property="borderbrush" value="{staticresource button.static.border}"/> <setter property="foreground" value="{dynamicresource {x:static systemcolors.controltextbrushkey}}"/> <setter property="borderthickness" value="1"/> <setter property="horizontalcontentalignment" value="center"/> <setter property="verticalcontentalignment" value="center"/> <setter property="padding" value="1"/> <setter property="template"> <setter.value> <controltemplate targettype="{x:type togglebutton}"> <border x:name="border" borderbrush="{templatebinding borderbrush}" borderthickness="{templatebinding borderthickness}" background="{templatebinding background}" snapstodevicepixels="true"> <contentpresenter x:name="contentpresenter" focusable="false" horizontalalignment="{templatebinding horizontalcontentalignment}" margin="{templatebinding padding}" recognizesaccesskey="true" snapstodevicepixels="{templatebinding snapstodevicepixels}" verticalalignment="{templatebinding verticalcontentalignment}"/> </border> <controltemplate.triggers> <trigger property="button.isdefaulted" value="true"> <setter property="borderbrush" targetname="border" value="{dynamicresource {x:static systemcolors.highlightbrushkey}}"/> </trigger> <trigger property="ismouseover" value="true"> <setter property="background" targetname="border" value="{staticresource button.mouseover.background}"/> <setter property="borderbrush" targetname="border" value="{staticresource button.mouseover.border}"/> </trigger> <trigger property="ischecked" value="true"> <setter property="background" targetname="border" value="{staticresource button.pressed.background}"/> <setter property="borderbrush" targetname="border" value="{staticresource button.pressed.border}"/> </trigger> <multitrigger> <multitrigger.conditions> <condition property="ischecked" value="false" /> <condition property="isenabled" value="false" /> </multitrigger.conditions> <multitrigger.setters> <setter property="background" targetname="border" value="{staticresource button.disabled.background}"/> <setter property="borderbrush" targetname="border" value="{staticresource button.disabled.border}"/> <setter property="textelement.foreground" targetname="contentpresenter" value="{staticresource button.disabled.foreground}"/> </multitrigger.setters> </multitrigger> <multitrigger> <multitrigger.conditions> <condition property="ischecked" value="true" /> <condition property="isenabled" value="false" /> </multitrigger.conditions> <multitrigger.setters> <setter property="textelement.foreground" targetname="contentpresenter" value="{staticresource button.disabled.foreground}"/> </multitrigger.setters> </multitrigger> </controltemplate.triggers> </controltemplate> </setter.value> </setter> </style>
i tried solve problem , can setting tb.ishittestvisible=false;
leave isenabled=true
.
allow button retain it's visual state disable interaction it.
treat isreadonly
.
edit:
after long think went ahead , used blend create style button:
<style x:key="focusvisual"> <setter property="control.template"> <setter.value> <controltemplate> <rectangle margin="2" snapstodevicepixels="true" stroke="{dynamicresource {x:static systemcolors.controltextbrushkey}}" strokethickness="1" strokedasharray="1 2"/> </controltemplate> </setter.value> </setter> </style> <solidcolorbrush x:key="button.static.background" color="#ffdddddd"/> <solidcolorbrush x:key="button.static.border" color="#ff707070"/> <solidcolorbrush x:key="button.mouseover.background" color="#ffbee6fd"/> <solidcolorbrush x:key="button.mouseover.border" color="#ff3c7fb1"/> <solidcolorbrush x:key="button.pressed.background" color="#ffc4e5f6"/> <solidcolorbrush x:key="button.pressed.border" color="#ff2c628b"/> <solidcolorbrush x:key="button.disabled.background" color="#fff4f4f4"/> <solidcolorbrush x:key="button.disabled.border" color="#ffadb2b5"/> <solidcolorbrush x:key="button.disabled.foreground" color="#ff838383"/> <style x:key="disabledandcheckedbutton" targettype="{x:type togglebutton}"> <setter property="focusvisualstyle" value="{staticresource focusvisual}"/> <setter property="background" value="{staticresource button.static.background}"/> <setter property="borderbrush" value="{staticresource button.static.border}"/> <setter property="foreground" value="{dynamicresource {x:static systemcolors.controltextbrushkey}}"/> <setter property="borderthickness" value="1"/> <setter property="horizontalcontentalignment" value="center"/> <setter property="verticalcontentalignment" value="center"/> <setter property="padding" value="1"/> <setter property="template"> <setter.value> <controltemplate targettype="{x:type togglebutton}"> <border x:name="border" borderbrush="{templatebinding borderbrush}" borderthickness="{templatebinding borderthickness}" background="{templatebinding background}" snapstodevicepixels="true"> <contentpresenter x:name="contentpresenter" focusable="false" horizontalalignment="{templatebinding horizontalcontentalignment}" margin="{templatebinding padding}" recognizesaccesskey="true" snapstodevicepixels="{templatebinding snapstodevicepixels}" verticalalignment="{templatebinding verticalcontentalignment}"/> </border> <controltemplate.triggers> <trigger property="button.isdefaulted" value="true"> <setter property="borderbrush" targetname="border" value="{dynamicresource {x:static systemcolors.highlightbrushkey}}"/> </trigger> <trigger property="ismouseover" value="true"> <setter property="background" targetname="border" value="{staticresource button.mouseover.background}"/> <setter property="borderbrush" targetname="border" value="{staticresource button.mouseover.border}"/> </trigger> <trigger property="ischecked" value="true"> <setter property="background" targetname="border" value="{staticresource button.pressed.background}"/> <setter property="borderbrush" targetname="border" value="{staticresource button.pressed.border}"/> </trigger> <trigger property="isenabled" value="false"> <setter property="background" targetname="border" value="{staticresource button.disabled.background}"/> <setter property="borderbrush" targetname="border" value="{staticresource button.disabled.border}"/> <setter property="textelement.foreground" targetname="contentpresenter" value="{staticresource button.disabled.foreground}"/> </trigger> </controltemplate.triggers> </controltemplate> </setter.value> </setter> </style>
this bit of code go app.xaml file can reference anywhere in app.
use piece follows:
<togglebutton content="{binding .}" style="{staticresource disabledandcheckedbutton}"/>
and if want keep code-behind
(not cool bro)
then use snippet programatically generate buttons:
style style = this.findresource("disabledandcheckedbutton") style; tb.style = style;
let know if need help.
Comments
Post a Comment